diff --git a/ReallifeGamemode.Client/Gui/Inventory/inventory.ts b/ReallifeGamemode.Client/Gui/Inventory/inventory.ts index 0b4b95d2..afb9e735 100644 --- a/ReallifeGamemode.Client/Gui/Inventory/inventory.ts +++ b/ReallifeGamemode.Client/Gui/Inventory/inventory.ts @@ -1,1145 +1,101 @@ import InputHelper from '../../inputhelper'; export default function inventory(globalData: IGlobalData) { - var q; - var qw = 0; + + var inv; + var showInventory; - var show = false; //ob das Inventar dem Spieler gezeigt wird. - var showAdmin = false; //ob das Inventar eines Spielers dem Admin gezeigt wird + //SCREEN STUFF const { x: screenX, y: screenY } = mp.game.graphics.getScreenActiveResolution(0, 0); let rxC = 0.5; //Breitenpositionierung des Inventars auf Screen-(C)enter let ryC = 0.4; //Höhenpositionierung des Inventars auf Screen-(C)enter - let rWidth = 0.4; - let sX = (screenX * 0.1 / 1000); - let sY = (screenY * 0.1 / 1000); - let eX = sX - 0.1; - let eY = sY - 0.1; let aspectRatioFactor = screenX / screenY; //Höhenmultiplikator (damit Quadrate anstatt Rechtecke der einzelnen Slots entstehen) let sizeMulx = 0.08; //Größenmultiplikator (GUI Skalierung) let sizeMuly = sizeMulx * aspectRatioFactor; //Größenmultiplikator (GUI Skalierung) - let sizeMulxHalf = sizeMulx / 2; - let sizeMulyHalf = sizeMuly / 2; - var targetPlayerName; //Der Spieler der den Handel anfragt - let closePos = [0.7125, 0.17] //Position des X für Adminansicht - let tradeBoxPos = [0.7125, 0.82] //Center der Handelsbox - var clickTime; //Für Berechnung wie lange der Mausklick-Handler zwischen Aktionen benötigt - var itemRadial = false; //Ob das Item-Radialmenü gezeigt wird - var hoverGrid; //Ob man über einem Gridfeld hovert - var radialSelect = "none"; //Auswahl des Radialmenüs - var clickedItem; //Das angeklickte Item für das Radialmenü - //let aspectRatioFactor = ; //Seitenverhältnis des Bildschirms (Entspricht yMul aufgerundet) - var upRColor = 222; //Standard Transparenzen für das Hovern über der Radialauswahl - var downRColor = 222; //Standard Transparenzen für das Hovern über der Radialauswahl - var leftRColor = 222; //Standard Transparenzen für das Hovern über der Radialauswahl - var rightRColor = 222; //Standard Transparenzen für das Hovern über der Radialauswahl - var radialDescription; //Radialbeschreibung die über dem Mauszeiger angezeigt wird wenn man hovert. - var tradePartner = "Keinem"; //Der Spieler mit dem man Handeln möchte - var tradePrize = 0; //Der Preis welcher dem Handelempfänger angezeigt wird - var tradeConfirm = false; //Ob der Handelspartner den Handel akzeptiert - var isTrading = false; //Bestimmt ob das Handelsfenster unten angezeigt wird - var isTradingResult = false; - var dragTradeItem = null; //Ob aktuell ein Item aus dem Handelfenster gezogen wird - var spriteScaleX = rWidth / 8; - var spriteScaleY = rWidth / 8 * aspectRatioFactor; - var syncStatus = false; //Synchronisation mit der Datenbank - var syncCount = 0; //Wieviele Slots noch gesynced werden müssen - var syncDeg = 0; + let rWidth = 0.4; - var inventoryWeight; //Das aktuelle Inventargewicht, berechnet aus allen Metainfos des items[[]] Array - var items = [[]]; //Items aus der Datenbank - var tradeItems = []; //Handelsitems aus der aktuellen Handelssession - var tradeResultItems = [[]]; + class inventory { + slots: slot[]; + slotId: number; + weight: number; + slotAmount: number = 20; - var grid = []; - grid[0] = [0.3375, 0.205] - grid[1] = [0.4195, 0.205] - grid[2] = [0.5015, 0.205] - grid[3] = [0.5835, 0.205] - grid[4] = [0.6655, 0.205] - grid[5] = [0.3375, 0.355] - grid[6] = [0.4195, 0.355] - grid[7] = [0.5015, 0.355] - grid[8] = [0.5835, 0.355] - grid[9] = [0.6655, 0.355] - grid[10] = [0.3375, 0.505] - grid[11] = [0.4195, 0.505] - grid[12] = [0.5015, 0.505] - grid[13] = [0.5835, 0.505] - grid[14] = [0.6655, 0.505] - grid[15] = [0.3375, 0.655] - grid[16] = [0.4195, 0.655] - grid[17] = [0.5015, 0.655] - grid[18] = [0.5835, 0.655] - grid[19] = [0.6655, 0.655] + constructor() { + this.slots[0] = new slot([0.3375, 0.205]) + this.slots[1] = new slot([0.4195, 0.205]) + this.slots[2] = new slot([0.5015, 0.205]) + this.slots[3] = new slot([0.5835, 0.205]) + this.slots[4] = new slot([0.6655, 0.205]) + this.slots[5] = new slot([0.3375, 0.355]) + this.slots[6] = new slot([0.4195, 0.355]) + this.slots[7] = new slot([0.5015, 0.355]) + this.slots[8] = new slot([0.5835, 0.355]) + this.slots[9] = new slot([0.6655, 0.355]) + this.slots[10] = new slot([0.3375, 0.505]) + this.slots[11] = new slot([0.4195, 0.505]) + this.slots[12] = new slot([0.5015, 0.505]) + this.slots[13] = new slot([0.5835, 0.505]) + this.slots[14] = new slot([0.6655, 0.505]) + this.slots[15] = new slot([0.3375, 0.655]) + this.slots[16] = new slot([0.4195, 0.655]) + this.slots[17] = new slot([0.5015, 0.655]) + this.slots[18] = new slot([0.5835, 0.655]) + this.slots[19] = new slot([0.6655, 0.655]) + } - var tradeGrid = []; - tradeGrid[0] = [0.3375, 0.925] - tradeGrid[1] = [0.4195, 0.925] - tradeGrid[2] = [0.5015, 0.925] - tradeGrid[3] = [0.5835, 0.925] - tradeGrid[4] = [0.6655, 0.925] + drawInventoryBackGround() { + mp.game.graphics.set2dLayer(1); // LAYER 1 + mp.game.graphics.drawRect(rxC, ryC, 0.45, 0.7, 255, 255, 255, 200); //INVENTARHINTERGRUND - var mouseLDown = false; //Ob die Linke Maustaste gedrückt wird (while) - var mouseRDown = false; //Ob die Rechte Maustaste gedrückt wird (while) - var hoverItem; //Das Item über welches der Mauszeiger schwebt - var dragItem = null; //Das Item das aktuell gezogen wird - var oldDragSlot; //Ursprungsslot des gezogenen Items - var actFreeSlot; //Ob der aktuelle Hover-Slot während des Item-ziehens frei ist - var actFreeTradeSlot; //Ob der aktuelle TradeInventar-Hover-Slot während des Item-ziehens frei ist - var bufferItem = []; - var stackToItem; //Der Slot zu dem das aktuelle Item gestackt würde, wenn man die Maustaste loslässt - var stackToTradeItem; //Der Handels-Slot zu dem das aktuelle Item gestackt würde, wenn man die Maustaste loslässt + mp.game.graphics.set2dLayer(2); // LAYER 2 - mp.events.add("showInventory", (invWeight, itemArr) => { - if (show === false) { - //mp.gui.chat.activate(false); + //INVENTARÜBERSCHRIFT + mp.game.graphics.drawText("Inventar ~g~" + this.weight + "/40000g", [rxC, ryC - (rWidth / 1.20)], { + font: 7, + color: [112, 128, 144, 254], + scale: [0.7, 0.7], + outline: true, + centre: false + }); + } + } + + class slot { + id: number; + x: number; + y: number; + position: [number, number]; + item: inventoryItem; + + constructor(position) { - mp.gui.cursor.show(true, true); - inventoryWeight = invWeight; - items = itemArr; - show = true; - mp.game.graphics.requestStreamedTextureDict("itemimages", true); - } else { - mp.events.callRemote('saveInventory', JSON.stringify(items)); - mp.gui.chat.activate(true); - mp.gui.cursor.show(false, false); - show = false; - syncCount++; - mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("itemimages"); - inventoryWeight = 0; - items = null; - itemRadial = false; - if (tradeItems.length === 0) { - isTrading = false; - } } - }); + } - //Zeigt dem Handelsanfragenden das Handelsinventar - mp.events.add("openTradeMenu", (tradePartnerName) => { - tradePartner = tradePartnerName; - isTrading = true; - }); + class inventoryItem { + id: number; + name: string; + description: string; + sprite: number; + weight: number; + } - //Zeigt dem Handelspartner das Fenster zur Annahme oder Verweigerung des Handels - mp.events.add("showTradeRequest", () => { - show = false; - }); - - //Zeigt dem Admin das Inventar eines Spielers - mp.events.add("showInventoryToAdmin", (pName, invWeight, itemArr) => { - if (showAdmin === false) { - targetPlayerName = pName; - mp.gui.chat.activate(false); - inventoryWeight = invWeight; - items = itemArr; - mp.game.graphics.requestStreamedTextureDict("itemimages", true); - setTimeout(() => mp.gui.cursor.show(true, true), 100); - showAdmin = true; - } - }); - - //Falls das Inventar aktuell offen ist und ein neues hinzugefügt wird, wird dieses Live angezeigt. - mp.events.add("addItem", (item) => { - if (show) { - items.push(JSON.parse(item)); - } - }); - - //Löscht die Handelsitems beim Handelsanfragenden - mp.events.add("clearTradeItems", () => { - tradeConfirm = false; - tradeItems.splice(0, tradeItems.length); - tradePartner = "Keinem"; - tradePrize = 0; - }); - - - //Zeigt dem Handelspartner die zu handelnden Items unter seinem Inventar an. - mp.events.add("showTradeItems", (tradeResultItemArray) => { - //for (var i = 0; i < tradeResultItemArray.length; i++) { - - // tradeItems.push(tradeResultItemArray[i]); - //} - tradeItems = JSON.parse(tradeResultItemArray); - isTrading = true; - }); - - //Entsperrt beim Handelsanfragenden die Items aus dem Handelsfenster - mp.events.add("unlockTradeItems", () => { - tradeConfirm = false; - tradePartner = "Keinem"; - tradePrize = 0; - }); - - //Falls ein Item administrativ entfernt wird, würde auch dies Live angezeigt. - mp.events.add("removeItem", (userItemId, amount) => { - if (show) { - var arrIndex; - for (var i = 0; i < items.length; i++) { - if (items[i][5] === userItemId) { - arrIndex = i; - } - } - inventoryWeight -= parseInt(items[arrIndex][2]) * amount; - items[arrIndex][3] -= amount; - if (items[arrIndex][3] === 0) { - items.splice(arrIndex, 1); - } - } - }); - - mp.events.add("SERVER:INVENTORY_SYNC", () => { - syncCount--; + mp.events.add("openInventory", (itemArray) => { + var inv = new inventory(); + showInventory = true; }); mp.events.add("render", () => { - var pos; - if (show === true) { - pos = mp.gui.cursor.position; - - for (q = 0; q < items.length; q++) { - mp.game.graphics.drawText("[" + items[q][0] + "]" + "[" + items[q][2] + "]" + "[" + items[q][3] + "]" + "[" + items[q][4] + "]" + "[" + items[q][5] + "]", [0.1, 0.4 + qw], { - //mp.game.graphics.drawText("(MOIN)", [0.1, 0.4 + qw], { - font: 4, - color: [255, 255, 255, 254], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - qw += 0.025; - } - - mp.game.graphics.set2dLayer(1); //# - mp.game.graphics.drawRect(rxC, ryC, 0.45, 0.7, 255, 255, 255, 200); //INVENTARHINTERGRUND - - mp.game.graphics.set2dLayer(2); //## - - //INVENTARÜBERSCHRIFT - mp.game.graphics.drawText("Inventar ~g~" + inventoryWeight + "/40000g", [rxC, ryC - (rWidth / 1.20)], { - font: 7, - color: [112, 128, 144, 254], - scale: [0.7, 0.7], - outline: true, - centre: false - }); - - if (syncCount != 0) { - syncDeg += 3; - if (syncDeg === 360) syncDeg = 0; - - mp.game.graphics.drawText("~s~synchronisiere ~g~ " + syncCount, [rxC + 0.165, ryC - (rWidth / 1.20) + 0.035], { - font: 7, - color: [112, 128, 144, 254], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - mp.game.graphics.drawSprite("itemimages", "refresh", rxC + 0.165, ryC - (rWidth / 1.20) + 0.01, spriteScaleX * 0.4, spriteScaleY * 0.4, syncDeg, 255, 255, 255, 255); - } else { - mp.game.graphics.drawText("~s~synchronisiert", [rxC + 0.165, ryC - (rWidth / 1.20) + 0.035], { - font: 7, - color: [112, 128, 144, 254], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - } - - //SLOTS [RECHTECKE] [SLOTZAHLEN] - - var slots; - var tempSlot; - for (slots = 0; slots < grid.length; slots++) { - mp.game.graphics.drawRect(grid[slots][0], grid[slots][1], sizeMulx, sizeMuly, 112, 128, 144, 254); - mp.game.graphics.drawText(tempSlot = slots + 1, [grid[slots][0] - sizeMulxHalf + 0.006, grid[slots][1] - (sizeMulxHalf * aspectRatioFactor)], { - font: 7, - color: [255, 69, 0, 254], - scale: [0.3, 0.3], - outline: true, - centre: false - }); - } - - mp.game.graphics.set2dLayer(3); //### - - var currentItem; - - //SPRITES + ITEMANZAHL - for (currentItem = 0; currentItem < items.length; currentItem++) { - if (items[currentItem][4] !== "-1") { - mp.game.graphics.drawSprite("itemimages", items[currentItem][0].toLowerCase(), grid[items[currentItem][4] - 1][0], grid[items[currentItem][4] - 1][1], spriteScaleX, spriteScaleY, 0, 255, 255, 255, 255); - mp.game.graphics.drawText("(~y~" + items[currentItem][3] + "~s~)", [grid[items[currentItem][4] - 1][0] + sizeMulxHalf - 0.008, grid[items[currentItem][4] - 1][1] + 0.05], { - font: 0, - color: [255, 255, 255, 255], - scale: [0.25, 0.25], - outline: true, - centre: false - }); - } - } - - var hoverItemP; - - mp.game.graphics.set2dLayer(4); //#### - //WENN MAUS ÜBER ITEM - if (isMouseOverItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) { - mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220); - - hoverItemP = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3]]; - - //NAME - mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - - //BESCHREIBUNG - mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.35, 0.35], - outline: true, - centre: false - }); - - //EINZELGEWICHT - mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.35, 0.35], - outline: true, - centre: false - }); - } - - //WENN MOUSE DOWN - if (mouseLDown && dragItem !== null || mouseRDown && dragItem !== null) { - - if (isMouseOverFreeSlot(pos[0], pos[1]) || isMouseOverFreeTradeSlot(pos[0], pos[1]) || isItemOverSameItem(pos[0], pos[1]) || isItemOverSameTradeItem(pos[0], pos[1])) { - if (dragTradeItem === false) { - mp.game.graphics.drawSprite("itemimages", items[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, spriteScaleX, spriteScaleY, 0, 100, 255, 100, 255); - } else { - mp.game.graphics.drawSprite("itemimages", tradeItems[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, spriteScaleX, spriteScaleY, 0, 100, 255, 100, 255); - } - } else { - if (dragTradeItem === false) { - mp.game.graphics.drawSprite("itemimages", items[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, spriteScaleX, spriteScaleY, 0, 255, 100, 100, 255); - } else { - mp.game.graphics.drawSprite("itemimages", tradeItems[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, spriteScaleX, spriteScaleY, 0, 255, 100, 100, 255); - } - } - } - mp.game.graphics.set2dLayer(5); //##### - if (itemRadial === true) { - mp.game.graphics.drawSprite("itemimages", "radialsplit", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 0, 0, 0, 255); - mp.game.graphics.drawSprite("itemimages", "radialup", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, upRColor, 222, upRColor); - mp.game.graphics.drawSprite("itemimages", "radialdown", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, downRColor, 222, downRColor); - //mp.game.graphics.drawSprite("itemimages", "radialleft", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, leftRColor, 222, leftRColor); - //mp.game.graphics.drawSprite("itemimages", "radialright", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, rightRColor, 222, rightRColor); - - mp.game.graphics.set2dLayer(6); //###### - mp.game.graphics.drawSprite("itemimages", "radialdrop", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 255, 255, 255, 255); - mp.game.graphics.drawSprite("itemimages", "radialuse", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 255, 255, 255, 255); - } - mp.game.graphics.set2dLayer(7); //####### - - if (ifMouseSelectRadial(pos[0], pos[1])) { - //mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY - 0.02, 0.08, 0.03, 0, 0, 0, 255); - mp.game.graphics.drawText("~g~" + radialDescription, [pos[0] / screenX, pos[1] / screenY - 0.033], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.5, 0.5], - outline: true, - centre: false - }); - } - if (isTrading) { - mp.game.graphics.set2dLayer(1); - mp.game.graphics.drawRect(rxC, 0.925, 0.45, 0.25, 255, 255, 255, 200); - mp.game.graphics.set2dLayer(2); - var tempSlot2; - for (slots = 0; slots < tradeGrid.length; slots++) { - mp.game.graphics.drawRect(tradeGrid[slots][0], tradeGrid[slots][1], sizeMulx, sizeMuly, 112, 128, 144, 254); - mp.game.graphics.drawText(tempSlot2 = slots + 1, [tradeGrid[slots][0] - sizeMulxHalf + 0.006, tradeGrid[slots][1] - (sizeMulxHalf * aspectRatioFactor)], { - font: 7, - color: [69, 255, 0, 254], - scale: [0.3, 0.3], - outline: true, - centre: false - }); - } - - mp.game.graphics.set2dLayer(3); - - //SPRITES + ITEMANZAHL - if (tradeItems.length !== 0) { - for (currentItem = 0; currentItem < tradeItems.length; currentItem++) { - if (tradeItems[currentItem][4] !== "-1") { - mp.game.graphics.drawSprite("itemimages", tradeItems[currentItem][0].toLowerCase(), tradeGrid[tradeItems[currentItem][4] - 1][0], tradeGrid[tradeItems[currentItem][4] - 1][1], spriteScaleX, spriteScaleY, 0, 255, 255, 255, 255); - mp.game.graphics.drawText("(~y~" + tradeItems[currentItem][3] + "~s~)", [tradeGrid[tradeItems[currentItem][4] - 1][0] + sizeMulxHalf - 0.008, tradeGrid[tradeItems[currentItem][4] - 1][1] + 0.05], { - font: 0, - color: [255, 255, 255, 255], - scale: [0.25, 0.25], - outline: true, - centre: false - }); - if (tradeConfirm === true) { - mp.game.graphics.drawSprite("itemimages", "lock", tradeGrid[tradeItems[currentItem][4] - 1][0], tradeGrid[tradeItems[currentItem][4] - 1][1], spriteScaleX / 2, spriteScaleY / 2, 0, 255, 255, 255, 255); - } - } - } - } - //} else { - // if (tradeResultItems.length !== 0) { - // for (var currentItem = 0; currentItem < tradeResultItems.length; currentItem++) { - // mp.game.graphics.drawSprite("itemimages", tradeResultItems[currentItem][0].toLowerCase(), tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][0], tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][1], spriteScaleX, spriteScaleY, 0, 255, 255, 255, 255); - // mp.game.graphics.drawText("(~y~" + tradeResultItems[currentItem][3] + "~s~)", [tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][0] + (sizeMul / 2) - 0.008, tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][1] + 0.05], { - // font: 0, - // color: [255, 255, 255, 255], - // scale: [0.25, 0.25], - // outline: true, - // }); - // } - // } - //} - - mp.game.graphics.drawText("Handel mit ~y~" + tradePartner + " ~s~ für ~g~ " + tradePrize + "$", [rxC, 0.81], { - font: 7, - color: [112, 128, 144, 254], - scale: [0.6, 0.6], - outline: true, - centre: false - }); - mp.game.graphics.set2dLayer(4); - if (tradeConfirm === false) { - mp.game.graphics.drawSprite("itemimages", "box", tradeBoxPos[0], tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255); - } else { - mp.game.graphics.drawSprite("itemimages", "boxticked", tradeBoxPos[0], tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255); - } - mp.game.graphics.drawSprite("itemimages", "dollar", tradeBoxPos[0] - 0.025, tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255); - - if (isMouseOverTradeDollar(pos[0], pos[1])) { - mp.game.graphics.drawText("~g~ Preis festlegen", [pos[0] / screenX, pos[1] / screenY - 0.033], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.5, 0.5], - outline: true, - centre: false - }); - } - if (isMouseOverTradeBox(pos[0], pos[1])) { - mp.game.graphics.drawText("~g~Handelsanfrage absenden", [pos[0] / screenX, pos[1] / screenY - 0.033], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.5, 0.5], - outline: true, - centre: false - }); - } - - mp.game.graphics.set2dLayer(5); - if (isMouseOverTradeItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) { - mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220); - - hoverItemP = [tradeItems[hoverItem][0], tradeItems[hoverItem][1], tradeItems[hoverItem][2], tradeItems[hoverItem][3]]; - - //NAME - mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - - //BESCHREIBUNG - mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.35, 0.35], - outline: true, - centre: false - }); - - //EINZELGEWICHT - mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.35, 0.35], - outline: true, - centre: false - }); - } - } - - - - ////--------------------------------------------------------------DEBUG - //mp.game.graphics.drawText(itemRadial.toString() + " ~y~" + radialSelect, [0.5, 0.05], { - // font: 7, - // color: [255, 0, 0, 255], - // scale: [0.7, 0.7], - // outline: true, - //}); - ////KOORDINATEN - //mp.game.graphics.drawText((pos[0] / screenX).toFixed(3) + " / " + (pos[1] / screenY).toFixed(3) + " " + tradeItems.length, [pos[0] / screenX, pos[1] / screenY - 0.02], { - // font: 4, - // color: [255, 255, 255, 255], - // scale: [0.4, 0.4], - // outline: true, - //}); - ////----------------------------------------------------------DEBUG END - } - qw = 0; - if (showAdmin === true) { - pos = mp.gui.cursor.position; - - mp.game.graphics.set2dLayer(1); - //INVENTARHINTERGRUND - mp.game.graphics.drawRect(rxC, ryC, 0.45, 0.7, 255, 255, 255, 200); - - mp.game.graphics.set2dLayer(2); - //INVENTARÜBERSCHRIFT - mp.game.graphics.drawText("Inventar von ~y~" + targetPlayerName + " ~g~" + inventoryWeight + "/40000g", [rxC, ryC - (rWidth / 1.20)], { - font: 7, - color: [112, 128, 144, 254], - scale: [0.7, 0.7], - outline: true, - centre: false - }); - - //SLOTS [RECHTECKE] [SLOTZAHLEN] - for (slots = 0; slots < grid.length; slots++) { - mp.game.graphics.drawRect(grid[slots][0], grid[slots][1], sizeMulx, sizeMuly, 112, 128, 144, 254); - mp.game.graphics.drawText(tempSlot = slots + 1, [grid[slots][0] - sizeMulxHalf + 0.006, grid[slots][1] - (sizeMulxHalf * aspectRatioFactor)], { - font: 7, - color: [255, 69, 0, 254], - scale: [0.3, 0.3], - outline: true, - centre: false - }); - } - - mp.game.graphics.set2dLayer(3); - //SPRITES + ITEMANZAHL - for (currentItem = 0; currentItem < items.length; currentItem++) { - if (items[currentItem][4] !== "-1") { - mp.game.graphics.drawSprite("itemimages", items[currentItem][0].toLowerCase(), grid[items[currentItem][4] - 1][0], grid[items[currentItem][4] - 1][1], spriteScaleX, spriteScaleY, 0, 255, 255, 255, 255); - mp.game.graphics.drawText("(~y~" + items[currentItem][3] + "~s~)", [grid[items[currentItem][4] - 1][0] + sizeMulxHalf - 0.008, grid[items[currentItem][4] - 1][1] + 0.05], { - font: 0, - color: [255, 255, 255, 255], - scale: [0.25, 0.25], - outline: true, - centre: false - }); - } - } - - mp.game.graphics.set2dLayer(4); - //WENN MAUS ÜBER ITEM - if (isMouseOverItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) { - mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220); - - hoverItemP = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3]]; - - //NAME - mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - - //BESCHREIBUNG - mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.35, 0.35], - outline: true, - centre: false - }); - - //EINZELGEWICHT - mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.35, 0.35], - outline: true, - centre: false - }); - } - - if (isMouseOverX(pos[0], pos[1])) { - mp.game.graphics.drawSprite("itemimages", "x", closePos[0], closePos[1], 0.02, 0.035, 0, 220, 20, 60, 255); - } else { - mp.game.graphics.drawSprite("itemimages", "x", closePos[0], closePos[1], 0.02, 0.035, 0, 255, 255, 255, 255); - } + if (showInventory) { } }); - function isMouseOverItem(cX, cY) { + function initInventory(slots) { - var x, y, a, b, c, s, invSlot; - x = cX / screenX; - y = cY / screenY; - if (dragItem === null) { - for (s = 0; s < 20; s++) { - a = grid[s][0] - x; - b = grid[s][1] - y; - c = Math.sqrt(a * a + b * b); - invSlot = (s + 1); - if (c < sizeMulxHalf) { - for (var i = 0; i < items.length; i++) { - if (parseInt(items[i][4]) === invSlot) { - hoverItem = i; - return true; - } - } - } - } - } else { - if (itemRadial === false) { - for (s = 0; s < 20; s++) { - a = grid[s][0] - x; - b = grid[s][1] - y; - c = Math.sqrt(a * a + b * b); - invSlot = (s + 1); - if (c < sizeMulxHalf) { - for (i = 0; i < items.length; i++) { - if (parseInt(items[i][4]) === invSlot) { - hoverGrid = s; - return true; - } - } - } - } - } - } - } - function isMouseOverTradeItem(cX, cY) { - - if (dragItem === null && isTrading) { - - var x = cX / screenX; - var y = cY / screenY; - var a; - var b; - var c; - - for (var s = 0; s < 5; s++) { - a = tradeGrid[s][0] - x; - b = tradeGrid[s][1] - y; - c = Math.sqrt(a * a + b * b); - - var invSlot = (s + 1); - - if (c < sizeMulxHalf) { - for (var i = 0; i < tradeItems.length; i++) { - if (parseInt(tradeItems[i][4]) === invSlot) { - hoverItem = i; - return true; - } - } - } - } - } } - function isMouseOverFreeSlot(cX2, cY2) { - - var x = cX2 / screenX; - var y = cY2 / screenY; - var isItemOnSlot = 0; - - for (var s = 0; s < 20; s++) { - var invSlot = (s + 1); - - if (x > grid[s][0] - sizeMulxHalf && x < grid[s][0] + sizeMulxHalf && y > grid[s][1] - sizeMulxHalf * aspectRatioFactor && y < grid[s][1] + sizeMulxHalf * aspectRatioFactor) { - for (var i = 0; i < items.length; i++) { - if (parseInt(items[i][4]) === invSlot) { - isItemOnSlot++; - } - } - if (isItemOnSlot === 0) { - actFreeSlot = s + 1; - return true; - } - } - } - } - - function isMouseOverFreeTradeSlot(cX2, cY2) { - - if (tradeConfirm === false) { - var x = cX2 / screenX; - var y = cY2 / screenY; - var isItemOnSlot = 0; - - for (var s = 0; s < 5; s++) { - var invSlot = (s + 1); - - if (x > tradeGrid[s][0] - sizeMulxHalf && x < tradeGrid[s][0] + sizeMulxHalf && y > tradeGrid[s][1] - sizeMulxHalf * aspectRatioFactor && y < tradeGrid[s][1] + sizeMulxHalf * aspectRatioFactor) { - for (var i = 0; i < tradeItems.length; i++) { - if (parseInt(tradeItems[i][4]) === invSlot) { - isItemOnSlot++; - } - } - if (isItemOnSlot === 0) { - actFreeTradeSlot = s + 1; - return true; - } - } - } - } - } - - function isItemOverSameItem(cX2, cY2) { - - if (dragItem !== null && items.length > 0) { - var x = cX2 / screenX; - var y = cY2 / screenY; - - for (var s = 0; s < 20; s++) { - var invSlot = (s + 1); - - if (x > grid[s][0] - sizeMulxHalf && x < grid[s][0] + sizeMulxHalf && y > grid[s][1] - sizeMulxHalf * aspectRatioFactor && y < grid[s][1] + sizeMulxHalf * aspectRatioFactor) { - - for (var i = 0; i < items.length; i++) { - if (dragTradeItem === false) { - if (items[dragItem][0] === items[i][0] && parseInt(items[i][4]) === invSlot && items[hoverItem][4] !== items[i][4]) { - stackToItem = i; - return true; - } - } else { - if (tradeItems[dragItem][0] === items[i][0] && parseInt(items[i][4]) === invSlot) { - stackToItem = i; - return true; - } - } - } - } - } - } - } - - function isItemOverSameTradeItem(cX2, cY2) { - - if (dragItem !== null && tradeItems.length > 0) { - var x = cX2 / screenX; - var y = cY2 / screenY; - for (var s = 0; s < 5; s++) { - var invSlot = (s + 1); - - if (x > tradeGrid[s][0] - sizeMulxHalf && x < tradeGrid[s][0] + sizeMulxHalf && y > tradeGrid[s][1] - sizeMulxHalf * aspectRatioFactor && y < tradeGrid[s][1] + sizeMulxHalf * aspectRatioFactor) { - - for (var i = 0; i < tradeItems.length; i++) { - if (dragTradeItem === false) { - if (items[dragItem][0] === tradeItems[i][0] && parseInt(tradeItems[i][4]) === invSlot) { - stackToTradeItem = i; - return true; - } - } else { - if (tradeItems[dragItem][0] === tradeItems[i][0] && parseInt(tradeItems[i][4]) === invSlot && tradeItems[hoverItem][4] !== tradeItems[i][4]) { - stackToTradeItem = i; - return true; - } - } - } - } - } - } - } - - function isMouseOverX(cX2, cY2) { - if (showAdmin) { - var x = cX2 / screenX; - var y = cY2 / screenY; - - if (x > closePos[0] - 0.01 && x < closePos[0] + 0.01 && y > closePos[1] - 0.0175 && y < closePos[1] + 0.0175) { - return true; - } - } - } - - function isMouseOverTradeBox(cX2, cY2) { - if (show && tradeConfirm === false) { - var x = cX2 / screenX; - var y = cY2 / screenY; - - if (x > tradeBoxPos[0] - 0.01 && x < tradeBoxPos[0] + 0.01 && y > tradeBoxPos[1] - 0.0175 && y < tradeBoxPos[1] + 0.0175) { - return true; - } - } - } - - function isMouseOverTradeDollar(cX2, cY2) { - if (show && tradeConfirm === false) { - var x = cX2 / screenX; - var y = cY2 / screenY; - - if (x > (tradeBoxPos[0] - 0.025) - 0.01 && x < (tradeBoxPos[0] - 0.025) + 0.01 && y > tradeBoxPos[1] - 0.0175 && y < tradeBoxPos[1] + 0.0175) { - return true; - } - } - } - - function ifMouseSelectRadial(cX2, cY2) { - if (show && itemRadial === true) { - var x = cX2 / screenX; - var y = cY2 / screenY; - var a; - var b; - var c; - - //OBEN - if (x > grid[hoverGrid][0] - 0.0255 / aspectRatioFactor && x < grid[hoverGrid][0] + 0.0255 / aspectRatioFactor && y < grid[hoverGrid][1] - 0.065 && y > grid[hoverGrid][1] - 0.2) { - radialSelect = "up"; - radialDescription = "Wegwerfen"; - upRColor = 255; - return true; - } - //UNTEN - else if (x > grid[hoverGrid][0] - 0.0255 / aspectRatioFactor && x < grid[hoverGrid][0] + 0.0255 / aspectRatioFactor && y > grid[hoverGrid][1] + 0.065 && y < grid[hoverGrid][1] + 0.2) { - radialSelect = "down"; - radialDescription = "Benutzen / Essen"; - downRColor = 255; - return true; - } - ////LINKS - //else if (x > grid[hoverGrid][0] - 0.2 / aspectRatioFactor && x < grid[hoverGrid][0] - 0.065 / aspectRatioFactor && y < grid[hoverGrid][1] + 0.0255 && y > grid[hoverGrid][1] - 0.0255) { - // radialSelect = "left"; - // leftRColor = 255; - // return true; - //} - ////RECHTS - //else if (x < grid[hoverGrid][0] + 0.2 / aspectRatioFactor && x > grid[hoverGrid][0] + 0.065 / aspectRatioFactor && y < grid[hoverGrid][1] + 0.0255 && y > grid[hoverGrid][1] - 0.0255) { - // radialSelect = "right"; - // rightRColor = 255; - // return true; - else { - upRColor = 222; - downRColor = 222; - leftRColor = 222; - rightRColor = 222; - } - } - } - - - //Mausklick Events - mp.events.add('click', (x, y, upOrDown, leftOrRight, relativeX, relativeY, worldPosition, hitEntity) => { - - if (show) { - //LINKE MAUSTASTE - //RUNTER - if (upOrDown === "down" && leftOrRight === "left" && mouseLDown === false && mouseRDown === false) { - - mouseLDown = true; - - //Wenn Maus über grünen Haken - if (isTrading && isMouseOverTradeBox(x, y) && tradePrize > 0) { - tradeConfirm = true; - mp.events.callRemote('sendTradeItemsToPartner', JSON.stringify(tradeItems), tradePrize, tradePartner); - } - - //Wenn Maus über Dollar Zeichen - if (isTrading && isMouseOverTradeDollar(x, y)) { - globalData.InMenu = true; - var tradeMoney = new InputHelper("Wie viel $ möchtest du für deine Items haben?", globalData); - tradeMoney.show(); - tradeMoney.getValue((data) => { - var amount = parseInt(data); - if (isNaN(amount) || amount < 0) { - mp.game.graphics.notify('~r~Du musst eine Zahl größer als 0 eingeben!'); - return; - } - globalData.InMenu = false; - tradePrize = amount; - }); - } - - //Wenn Maus über Item - if (isMouseOverItem(x, y) && dragItem === null && itemRadial === false) { - dragItem = hoverItem; - oldDragSlot = items[dragItem][4]; - items[dragItem][4] = "-1"; - dragTradeItem = false; - } - //wenn Maus über Radialmenü - if (ifMouseSelectRadial(x, y)) { - switch (radialSelect) { - case "up": - var dropInput = new InputHelper("Wie viel Items möchtest du wegwerfen?", globalData); - globalData.InMenu = true; - dropInput.show(); - dropInput.getValue((data) => { - var amount = parseInt(data); - if (isNaN(amount) || amount < 1) { - mp.game.graphics.notify('~r~Du musst eine Zahl größer als 0 eingeben!'); - return; - } else if (amount > parseInt(items[clickedItem][3])) { - mp.game.graphics.notify('~r~So viele Items hast du nicht!'); - return; - } - mp.events.callRemote('itemInteract', "drop", items[clickedItem][5], amount); - }); - globalData.InMenu = false; - itemRadial = false; - break; - case "down": - mp.events.callRemote('itemInteract', "use", items[clickedItem][5], 1); - itemRadial = false; - break; - case "left": - itemRadial = false; - break; - case "right": - itemRadial = false; - break; - } - } - //Wenn Maus über Tradeitem - if (isMouseOverTradeItem(x, y) && dragItem === null && itemRadial === false && tradeConfirm === false) { - dragItem = hoverItem; - oldDragSlot = tradeItems[dragItem][4]; - tradeItems[dragItem][4] = "-1"; - dragTradeItem = true; - } - } - - //HOCH - if (upOrDown === "up" && leftOrRight === "left" && mouseLDown === true && itemRadial === false) { - - mouseLDown = false; - - if (dragItem !== null) { - var newAmount; - - //wenn Maus über freien Slot - if (isMouseOverFreeSlot(x, y)) { - if (dragTradeItem === false) { - items[dragItem][4] = actFreeSlot; - } else { - items.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], tradeItems[dragItem][3], actFreeSlot.toString(), tradeItems[dragItem][5]]); - tradeItems.splice(dragItem, 1); - } - syncCount++; - mp.events.callRemote('saveInventory', JSON.stringify(items)); - oldDragSlot = null; - dragItem = null; - hoverItem = null; - } else if (isItemOverSameItem(x, y)) { - if (dragTradeItem === false) { - newAmount = parseInt(items[stackToItem][3]) + parseInt(items[dragItem][3]); - items[stackToItem][3] = newAmount.toString(); - items[dragItem][4] = "-1"; - } else { - newAmount = parseInt(items[stackToItem][3]) + parseInt(tradeItems[dragItem][3]); - items[stackToItem][3] = newAmount.toString(); - tradeItems.splice(dragItem, 1); - } - syncCount++; - mp.events.callRemote('saveInventory', JSON.stringify(items)); - oldDragSlot = null; - dragItem = null; - hoverItem = null; - } else if (isItemOverSameTradeItem(x, y)) { - if (dragTradeItem === false) { - newAmount = parseInt(tradeItems[stackToTradeItem][3]) + parseInt(items[dragItem][3]); - tradeItems[stackToTradeItem][3] = newAmount.toString(); - items[dragItem][4] = "-1"; - } else { - newAmount = parseInt(tradeItems[stackToTradeItem][3]) + parseInt(tradeItems[dragItem][3]); - tradeItems[stackToTradeItem][3] = newAmount.toString(); - tradeItems[dragItem][4] = "-1"; - } - syncCount++; - mp.events.callRemote('saveInventory', JSON.stringify(items)); - oldDragSlot = null; - dragItem = null; - hoverItem = null; - } else if (isMouseOverFreeTradeSlot(x, y)) { - if (dragTradeItem === false) { - tradeItems.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], items[dragItem][3], actFreeTradeSlot.toString(), items[dragItem][5]]); - items.splice(dragItem, 1); - } else { - tradeItems[dragItem][4] = actFreeTradeSlot; - } - syncCount++; - mp.events.callRemote('saveInventory', JSON.stringify(items)); - oldDragSlot = null; - dragItem = null; - hoverItem = null; - } else { - if (dragTradeItem === false) { - items[dragItem][4] = oldDragSlot; - } else { - tradeItems[dragItem][4] = oldDragSlot; - } - oldDragSlot = null; - dragItem = null; - hoverItem = null; - } - } - } - - //RECHTE MAUSTASTE - //RUNTER - if (upOrDown === "down" && leftOrRight === "right" && mouseLDown === false && mouseRDown === false && itemRadial === false) { - clickTime = Date.now(); - mouseRDown = true; - - if (isMouseOverItem(x, y) && dragItem === null) { - dragItem = hoverItem; - oldDragSlot = items[hoverItem][4]; - bufferItem = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3], items[hoverItem][4], items[hoverItem][5]]; - items[hoverItem][3]--; - dragTradeItem = false; - } else if (isMouseOverTradeItem(x, y) && dragItem === null && tradeConfirm === false) { - dragItem = hoverItem; - oldDragSlot = tradeItems[hoverItem][4]; - bufferItem = [tradeItems[hoverItem][0], tradeItems[hoverItem][1], tradeItems[hoverItem][2], tradeItems[hoverItem][3], tradeItems[hoverItem][4], tradeItems[hoverItem][5]]; - tradeItems[hoverItem][3]--; - dragTradeItem = true; - } - } - - //HOCH - if (upOrDown === "up" && leftOrRight === "right" && mouseRDown === true && itemRadial === false) { - mouseRDown = false; - if (Date.now() - clickTime < 100 && isMouseOverItem(x, y)) { - clickedItem = hoverItem; - items[hoverItem][3]++; - itemRadial = true; - hoverItem = null; - dragItem = null; - clickTime = null; - } else { - if (dragItem !== null) { - if (isMouseOverFreeSlot(x, y)) { - if (dragTradeItem === false) { - items.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], "1", actFreeSlot.toString(), "-1"]); - if (items[hoverItem][3] === 0) { - items[hoverItem][4] = "-1"; - items.splice(hoverItem, 1); - } - } else { - items.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], "1", actFreeSlot.toString(), "-1"]); - if (tradeItems[hoverItem][3] === 0) { - tradeItems.splice(hoverItem, 1); - } - } - syncCount++; - mp.events.callRemote('saveInventory', JSON.stringify(items)); - oldDragSlot = null; - dragItem = null; - hoverItem = null; - } else if (isItemOverSameItem(x, y)) { - items[stackToItem][3]++; - if (dragTradeItem === false) { - if (items[hoverItem][3] === 0) { - items[hoverItem][4] = "-1"; - } - } else { - if (tradeItems[hoverItem][3] === 0) { - tradeItems.splice(hoverItem, 1); - } - } - syncCount++; - mp.events.callRemote('saveInventory', JSON.stringify(items)); - bufferItem = null; - dragItem = null; - hoverItem = null; - oldDragSlot = null; - } else if (isItemOverSameTradeItem(x, y)) { - tradeItems[stackToTradeItem][3]++; - if (dragTradeItem === false) { - if (items[hoverItem][3] === 0) { - items[hoverItem][4] = "-1"; - } - } else { - if (tradeItems[hoverItem][3] === 0) { - tradeItems[hoverItem][4] = "-1"; - } - } - syncCount++; - mp.events.callRemote('saveInventory', JSON.stringify(items)); - oldDragSlot = null; - bufferItem = null; - dragItem = null; - hoverItem = null; - } else if (isMouseOverFreeTradeSlot(x, y)) { - if (dragTradeItem === false) { - tradeItems.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], "1", actFreeTradeSlot.toString(), "-1"]); - if (items[hoverItem][3] === 0) { - items[hoverItem][4] = "-1"; - } - } else { - tradeItems.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], "1", actFreeTradeSlot.toString(), "-1"]); - if (tradeItems[hoverItem][3] === 0) { - tradeItems[hoverItem][4] = "-1"; - } - } - syncCount++; - mp.events.callRemote('saveInventory', JSON.stringify(items)); - oldDragSlot = null; - dragItem = null; - hoverItem = null; - } else { - if (dragTradeItem === false) { - items[hoverItem][3]++; - } else { - tradeItems[hoverItem][3]++; - } - oldDragSlot = null; - bufferItem = null; - dragItem = null; - hoverItem = null; - } - } - } - } - } - if (showAdmin) { - //LINKE MAUSTASTE - //RUNTER - if (upOrDown === "down" && leftOrRight === "left" && mouseLDown === false && mouseRDown === false) { - - if (isMouseOverItem(x, y)) { - items[hoverItem][4] = "-1"; - inventoryWeight -= parseInt(items[hoverItem][2]) * parseInt(items[hoverItem][3]); - mp.events.callRemote('removeItemAsAdmin', "stack", items[hoverItem][5], targetPlayerName); - } else if (isMouseOverX(x, y)) { - mp.gui.chat.activate(true); - mp.gui.cursor.show(false, false); - showAdmin = false; - mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("itemimages"); - inventoryWeight = 0; - items = null; - } - } - - //RECHTE MAUSTASTE - //RUNTER - if (upOrDown === "down" && leftOrRight === "right" && mouseLDown === false && mouseRDown === false) { - - if (isMouseOverItem(x, y)) { - items[hoverItem][3]--; - mp.events.callRemote('removeItemAsAdmin', "one", items[hoverItem][5], targetPlayerName); - if (items[hoverItem][3] === 0) { - items[hoverItem][4] = "-1"; - } - inventoryWeight -= items[hoverItem][2]; - } - } - } - }); + } \ No newline at end of file diff --git a/ReallifeGamemode.Client/Gui/Inventory/inventory_old.ts b/ReallifeGamemode.Client/Gui/Inventory/inventory_old.ts new file mode 100644 index 00000000..2f6deb02 --- /dev/null +++ b/ReallifeGamemode.Client/Gui/Inventory/inventory_old.ts @@ -0,0 +1,1144 @@ +import InputHelper from '../../inputhelper'; + +export default function inventory(globalData: IGlobalData) { + var q; + var qw = 0; + var show = false; //ob das Inventar dem Spieler gezeigt wird. + var showAdmin = false; //ob das Inventar eines Spielers dem Admin gezeigt wird + const { x: screenX, y: screenY } = mp.game.graphics.getScreenActiveResolution(0, 0); + let rxC = 0.5; //Breitenpositionierung des Inventars auf Screen-(C)enter + let ryC = 0.4; //Höhenpositionierung des Inventars auf Screen-(C)enter + let rWidth = 0.4; + let sX = (screenX * 0.1 / 1000); + let sY = (screenY * 0.1 / 1000); + let eX = sX - 0.1; + let eY = sY - 0.1; + let aspectRatioFactor = screenX / screenY; //Höhenmultiplikator (damit Quadrate anstatt Rechtecke der einzelnen Slots entstehen) + let sizeMulx = 0.08; //Größenmultiplikator (GUI Skalierung) + let sizeMuly = sizeMulx * aspectRatioFactor; //Größenmultiplikator (GUI Skalierung) + let sizeMulxHalf = sizeMulx / 2; + let sizeMulyHalf = sizeMuly / 2; + var targetPlayerName; //Der Spieler der den Handel anfragt + let closePos = [0.7125, 0.17] //Position des X für Adminansicht + let tradeBoxPos = [0.7125, 0.82] //Center der Handelsbox + var clickTime; //Für Berechnung wie lange der Mausklick-Handler zwischen Aktionen benötigt + var itemRadial = false; //Ob das Item-Radialmenü gezeigt wird + var hoverGrid; //Ob man über einem Gridfeld hovert + var radialSelect = "none"; //Auswahl des Radialmenüs + var clickedItem; //Das angeklickte Item für das Radialmenü + //let aspectRatioFactor = ; //Seitenverhältnis des Bildschirms (Entspricht yMul aufgerundet) + var upRColor = 222; //Standard Transparenzen für das Hovern über der Radialauswahl + var downRColor = 222; //Standard Transparenzen für das Hovern über der Radialauswahl + var leftRColor = 222; //Standard Transparenzen für das Hovern über der Radialauswahl + var rightRColor = 222; //Standard Transparenzen für das Hovern über der Radialauswahl + var radialDescription; //Radialbeschreibung die über dem Mauszeiger angezeigt wird wenn man hovert. + var tradePartner = "Keinem"; //Der Spieler mit dem man Handeln möchte + var tradePrize = 0; //Der Preis welcher dem Handelempfänger angezeigt wird + var tradeConfirm = false; //Ob der Handelspartner den Handel akzeptiert + var isTrading = false; //Bestimmt ob das Handelsfenster unten angezeigt wird + var isTradingResult = false; + var dragTradeItem = null; //Ob aktuell ein Item aus dem Handelfenster gezogen wird + var spriteScaleX = rWidth / 8; + var spriteScaleY = rWidth / 8 * aspectRatioFactor; + var syncStatus = false; //Synchronisation mit der Datenbank + var syncCount = 0; //Wieviele Slots noch gesynced werden müssen + var syncDeg = 0; + + var inventoryWeight; //Das aktuelle Inventargewicht, berechnet aus allen Metainfos des items[[]] Array + var items = [[]]; //Items aus der Datenbank + var tradeItems = []; //Handelsitems aus der aktuellen Handelssession + var tradeResultItems = [[]]; + + var grid = []; + grid[0] = [0.3375, 0.205] + grid[1] = [0.4195, 0.205] + grid[2] = [0.5015, 0.205] + grid[3] = [0.5835, 0.205] + grid[4] = [0.6655, 0.205] + grid[5] = [0.3375, 0.355] + grid[6] = [0.4195, 0.355] + grid[7] = [0.5015, 0.355] + grid[8] = [0.5835, 0.355] + grid[9] = [0.6655, 0.355] + grid[10] = [0.3375, 0.505] + grid[11] = [0.4195, 0.505] + grid[12] = [0.5015, 0.505] + grid[13] = [0.5835, 0.505] + grid[14] = [0.6655, 0.505] + grid[15] = [0.3375, 0.655] + grid[16] = [0.4195, 0.655] + grid[17] = [0.5015, 0.655] + grid[18] = [0.5835, 0.655] + grid[19] = [0.6655, 0.655] + + var tradeGrid = []; + tradeGrid[0] = [0.3375, 0.925] + tradeGrid[1] = [0.4195, 0.925] + tradeGrid[2] = [0.5015, 0.925] + tradeGrid[3] = [0.5835, 0.925] + tradeGrid[4] = [0.6655, 0.925] + + var mouseLDown = false; //Ob die Linke Maustaste gedrückt wird (while) + var mouseRDown = false; //Ob die Rechte Maustaste gedrückt wird (while) + var hoverItem; //Das Item über welches der Mauszeiger schwebt + var dragItem = null; //Das Item das aktuell gezogen wird + var oldDragSlot; //Ursprungsslot des gezogenen Items + var actFreeSlot; //Ob der aktuelle Hover-Slot während des Item-ziehens frei ist + var actFreeTradeSlot; //Ob der aktuelle TradeInventar-Hover-Slot während des Item-ziehens frei ist + var bufferItem = []; + var stackToItem; //Der Slot zu dem das aktuelle Item gestackt würde, wenn man die Maustaste loslässt + var stackToTradeItem; //Der Handels-Slot zu dem das aktuelle Item gestackt würde, wenn man die Maustaste loslässt + + mp.events.add("showInventory", (invWeight, itemArr) => { + if (show === false) { + //mp.gui.chat.activate(false); + + mp.gui.cursor.show(true, true); + inventoryWeight = invWeight; + items = itemArr; + show = true; + mp.game.graphics.requestStreamedTextureDict("itemimages", true); + } else { + mp.events.callRemote('saveInventory', JSON.stringify(items)); + mp.gui.chat.activate(true); + mp.gui.cursor.show(false, false); + show = false; + syncCount++; + mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("itemimages"); + inventoryWeight = 0; + items = null; + itemRadial = false; + if (tradeItems.length === 0) { + isTrading = false; + } + } + }); + + //Zeigt dem Handelsanfragenden das Handelsinventar + mp.events.add("openTradeMenu", (tradePartnerName) => { + tradePartner = tradePartnerName; + isTrading = true; + }); + + //Zeigt dem Handelspartner das Fenster zur Annahme oder Verweigerung des Handels + mp.events.add("showTradeRequest", () => { + show = false; + }); + + //Zeigt dem Admin das Inventar eines Spielers + mp.events.add("showInventoryToAdmin", (pName, invWeight, itemArr) => { + if (showAdmin === false) { + targetPlayerName = pName; + mp.gui.chat.activate(false); + inventoryWeight = invWeight; + items = itemArr; + mp.game.graphics.requestStreamedTextureDict("itemimages", true); + setTimeout(() => mp.gui.cursor.show(true, true), 100); + showAdmin = true; + } + }); + + //Falls das Inventar aktuell offen ist und ein neues hinzugefügt wird, wird dieses Live angezeigt. + mp.events.add("addItem", (item) => { + if (show) { + items.push(JSON.parse(item)); + } + }); + + //Löscht die Handelsitems beim Handelsanfragenden + mp.events.add("clearTradeItems", () => { + tradeConfirm = false; + tradeItems.splice(0, tradeItems.length); + tradePartner = "Keinem"; + tradePrize = 0; + }); + + + //Zeigt dem Handelspartner die zu handelnden Items unter seinem Inventar an. + mp.events.add("showTradeItems", (tradeResultItemArray) => { + //for (var i = 0; i < tradeResultItemArray.length; i++) { + + // tradeItems.push(tradeResultItemArray[i]); + //} + tradeItems = JSON.parse(tradeResultItemArray); + isTrading = true; + }); + + //Entsperrt beim Handelsanfragenden die Items aus dem Handelsfenster + mp.events.add("unlockTradeItems", () => { + tradeConfirm = false; + tradePartner = "Keinem"; + tradePrize = 0; + }); + + //Falls ein Item administrativ entfernt wird, würde auch dies Live angezeigt. + mp.events.add("removeItem", (userItemId, amount) => { + if (show) { + var arrIndex; + for (var i = 0; i < items.length; i++) { + if (items[i][5] === userItemId) { + arrIndex = i; + } + } + inventoryWeight -= parseInt(items[arrIndex][2]) * amount; + items[arrIndex][3] -= amount; + if (items[arrIndex][3] === 0) { + items.splice(arrIndex, 1); + } + } + }); + + mp.events.add("SERVER:INVENTORY_SYNC", () => { + syncCount--; + }); + + mp.events.add("render", () => { + var pos; + if (show === true) { + pos = mp.gui.cursor.position; + + for (q = 0; q < items.length; q++) { + mp.game.graphics.drawText("[" + items[q][0] + "]" + "[" + items[q][2] + "]" + "[" + items[q][3] + "]" + "[" + items[q][4] + "]" + "[" + items[q][5] + "]", [0.1, 0.4 + qw], { + //mp.game.graphics.drawText("(MOIN)", [0.1, 0.4 + qw], { + font: 4, + color: [255, 255, 255, 254], + scale: [0.4, 0.4], + outline: true, + centre: false + }); + qw += 0.025; + } + + + mp.game.graphics.set2dLayer(1); //# + mp.game.graphics.drawRect(rxC, ryC, 0.45, 0.7, 255, 255, 255, 200); //INVENTARHINTERGRUND + + mp.game.graphics.set2dLayer(2); //## + + //INVENTARÜBERSCHRIFT + mp.game.graphics.drawText("Inventar ~g~" + inventoryWeight + "/40000g", [rxC, ryC - (rWidth / 1.20)], { + font: 7, + color: [112, 128, 144, 254], + scale: [0.7, 0.7], + outline: true, + centre: false + }); + + if (syncCount != 0) { + syncDeg += 3; + if (syncDeg === 360) syncDeg = 0; + + mp.game.graphics.drawText("~s~synchronisiere ~g~ " + syncCount, [rxC + 0.165, ryC - (rWidth / 1.20) + 0.035], { + font: 7, + color: [112, 128, 144, 254], + scale: [0.4, 0.4], + outline: true, + centre: false + }); + mp.game.graphics.drawSprite("itemimages", "refresh", rxC + 0.165, ryC - (rWidth / 1.20) + 0.01, spriteScaleX * 0.4, spriteScaleY * 0.4, syncDeg, 255, 255, 255, 255); + } else { + mp.game.graphics.drawText("~s~synchronisiert", [rxC + 0.165, ryC - (rWidth / 1.20) + 0.035], { + font: 7, + color: [112, 128, 144, 254], + scale: [0.4, 0.4], + outline: true, + centre: false + }); + } + + //SLOTS [RECHTECKE] [SLOTZAHLEN] + + var slots; + var tempSlot; + for (slots = 0; slots < grid.length; slots++) { + mp.game.graphics.drawRect(grid[slots][0], grid[slots][1], sizeMulx, sizeMuly, 112, 128, 144, 254); + mp.game.graphics.drawText(tempSlot = slots + 1, [grid[slots][0] - sizeMulxHalf + 0.006, grid[slots][1] - (sizeMulxHalf * aspectRatioFactor)], { + font: 7, + color: [255, 69, 0, 254], + scale: [0.3, 0.3], + outline: true, + centre: false + }); + } + + mp.game.graphics.set2dLayer(3); //### + + var currentItem; + + //SPRITES + ITEMANZAHL + for (currentItem = 0; currentItem < items.length; currentItem++) { + if (items[currentItem][4] !== "-1") { + mp.game.graphics.drawSprite("itemimages", items[currentItem][0].toLowerCase(), grid[items[currentItem][4] - 1][0], grid[items[currentItem][4] - 1][1], spriteScaleX, spriteScaleY, 0, 255, 255, 255, 255); + mp.game.graphics.drawText("(~y~" + items[currentItem][3] + "~s~)", [grid[items[currentItem][4] - 1][0] + sizeMulxHalf - 0.008, grid[items[currentItem][4] - 1][1] + 0.05], { + font: 0, + color: [255, 255, 255, 255], + scale: [0.25, 0.25], + outline: true, + centre: false + }); + } + } + + var hoverItemP; + + mp.game.graphics.set2dLayer(4); //#### + //WENN MAUS ÜBER ITEM + if (isMouseOverItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) { + mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220); + + hoverItemP = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3]]; + + //NAME + mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.4, 0.4], + outline: true, + centre: false + }); + + //BESCHREIBUNG + mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.35, 0.35], + outline: true, + centre: false + }); + + //EINZELGEWICHT + mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.35, 0.35], + outline: true, + centre: false + }); + } + + //WENN MOUSE DOWN + if (mouseLDown && dragItem !== null || mouseRDown && dragItem !== null) { + + if (isMouseOverFreeSlot(pos[0], pos[1]) || isMouseOverFreeTradeSlot(pos[0], pos[1]) || isItemOverSameItem(pos[0], pos[1]) || isItemOverSameTradeItem(pos[0], pos[1])) { + if (dragTradeItem === false) { + mp.game.graphics.drawSprite("itemimages", items[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, spriteScaleX, spriteScaleY, 0, 100, 255, 100, 255); + } else { + mp.game.graphics.drawSprite("itemimages", tradeItems[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, spriteScaleX, spriteScaleY, 0, 100, 255, 100, 255); + } + } else { + if (dragTradeItem === false) { + mp.game.graphics.drawSprite("itemimages", items[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, spriteScaleX, spriteScaleY, 0, 255, 100, 100, 255); + } else { + mp.game.graphics.drawSprite("itemimages", tradeItems[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, spriteScaleX, spriteScaleY, 0, 255, 100, 100, 255); + } + } + } + mp.game.graphics.set2dLayer(5); //##### + if (itemRadial === true) { + mp.game.graphics.drawSprite("itemimages", "radialsplit", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 0, 0, 0, 255); + mp.game.graphics.drawSprite("itemimages", "radialup", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, upRColor, 222, upRColor); + mp.game.graphics.drawSprite("itemimages", "radialdown", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, downRColor, 222, downRColor); + //mp.game.graphics.drawSprite("itemimages", "radialleft", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, leftRColor, 222, leftRColor); + //mp.game.graphics.drawSprite("itemimages", "radialright", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, rightRColor, 222, rightRColor); + + mp.game.graphics.set2dLayer(6); //###### + mp.game.graphics.drawSprite("itemimages", "radialdrop", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 255, 255, 255, 255); + mp.game.graphics.drawSprite("itemimages", "radialuse", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 255, 255, 255, 255); + } + mp.game.graphics.set2dLayer(7); //####### + + if (ifMouseSelectRadial(pos[0], pos[1])) { + //mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY - 0.02, 0.08, 0.03, 0, 0, 0, 255); + mp.game.graphics.drawText("~g~" + radialDescription, [pos[0] / screenX, pos[1] / screenY - 0.033], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.5, 0.5], + outline: true, + centre: false + }); + } + if (isTrading) { + mp.game.graphics.set2dLayer(1); + mp.game.graphics.drawRect(rxC, 0.925, 0.45, 0.25, 255, 255, 255, 200); + mp.game.graphics.set2dLayer(2); + var tempSlot2; + for (slots = 0; slots < tradeGrid.length; slots++) { + mp.game.graphics.drawRect(tradeGrid[slots][0], tradeGrid[slots][1], sizeMulx, sizeMuly, 112, 128, 144, 254); + mp.game.graphics.drawText(tempSlot2 = slots + 1, [tradeGrid[slots][0] - sizeMulxHalf + 0.006, tradeGrid[slots][1] - (sizeMulxHalf * aspectRatioFactor)], { + font: 7, + color: [69, 255, 0, 254], + scale: [0.3, 0.3], + outline: true, + centre: false + }); + } + + mp.game.graphics.set2dLayer(3); + + //SPRITES + ITEMANZAHL + if (tradeItems.length !== 0) { + for (currentItem = 0; currentItem < tradeItems.length; currentItem++) { + if (tradeItems[currentItem][4] !== "-1") { + mp.game.graphics.drawSprite("itemimages", tradeItems[currentItem][0].toLowerCase(), tradeGrid[tradeItems[currentItem][4] - 1][0], tradeGrid[tradeItems[currentItem][4] - 1][1], spriteScaleX, spriteScaleY, 0, 255, 255, 255, 255); + mp.game.graphics.drawText("(~y~" + tradeItems[currentItem][3] + "~s~)", [tradeGrid[tradeItems[currentItem][4] - 1][0] + sizeMulxHalf - 0.008, tradeGrid[tradeItems[currentItem][4] - 1][1] + 0.05], { + font: 0, + color: [255, 255, 255, 255], + scale: [0.25, 0.25], + outline: true, + centre: false + }); + if (tradeConfirm === true) { + mp.game.graphics.drawSprite("itemimages", "lock", tradeGrid[tradeItems[currentItem][4] - 1][0], tradeGrid[tradeItems[currentItem][4] - 1][1], spriteScaleX / 2, spriteScaleY / 2, 0, 255, 255, 255, 255); + } + } + } + } + //} else { + // if (tradeResultItems.length !== 0) { + // for (var currentItem = 0; currentItem < tradeResultItems.length; currentItem++) { + // mp.game.graphics.drawSprite("itemimages", tradeResultItems[currentItem][0].toLowerCase(), tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][0], tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][1], spriteScaleX, spriteScaleY, 0, 255, 255, 255, 255); + // mp.game.graphics.drawText("(~y~" + tradeResultItems[currentItem][3] + "~s~)", [tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][0] + (sizeMul / 2) - 0.008, tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][1] + 0.05], { + // font: 0, + // color: [255, 255, 255, 255], + // scale: [0.25, 0.25], + // outline: true, + // }); + // } + // } + //} + + mp.game.graphics.drawText("Handel mit ~y~" + tradePartner + " ~s~ für ~g~ " + tradePrize + "$", [rxC, 0.81], { + font: 7, + color: [112, 128, 144, 254], + scale: [0.6, 0.6], + outline: true, + centre: false + }); + mp.game.graphics.set2dLayer(4); + if (tradeConfirm === false) { + mp.game.graphics.drawSprite("itemimages", "box", tradeBoxPos[0], tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255); + } else { + mp.game.graphics.drawSprite("itemimages", "boxticked", tradeBoxPos[0], tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255); + } + mp.game.graphics.drawSprite("itemimages", "dollar", tradeBoxPos[0] - 0.025, tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255); + + if (isMouseOverTradeDollar(pos[0], pos[1])) { + mp.game.graphics.drawText("~g~ Preis festlegen", [pos[0] / screenX, pos[1] / screenY - 0.033], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.5, 0.5], + outline: true, + centre: false + }); + } + if (isMouseOverTradeBox(pos[0], pos[1])) { + mp.game.graphics.drawText("~g~Handelsanfrage absenden", [pos[0] / screenX, pos[1] / screenY - 0.033], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.5, 0.5], + outline: true, + centre: false + }); + } + + mp.game.graphics.set2dLayer(5); + if (isMouseOverTradeItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) { + mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220); + + hoverItemP = [tradeItems[hoverItem][0], tradeItems[hoverItem][1], tradeItems[hoverItem][2], tradeItems[hoverItem][3]]; + + //NAME + mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.4, 0.4], + outline: true, + centre: false + }); + + //BESCHREIBUNG + mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.35, 0.35], + outline: true, + centre: false + }); + + //EINZELGEWICHT + mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.35, 0.35], + outline: true, + centre: false + }); + } + } + + + + ////--------------------------------------------------------------DEBUG + //mp.game.graphics.drawText(itemRadial.toString() + " ~y~" + radialSelect, [0.5, 0.05], { + // font: 7, + // color: [255, 0, 0, 255], + // scale: [0.7, 0.7], + // outline: true, + //}); + ////KOORDINATEN + //mp.game.graphics.drawText((pos[0] / screenX).toFixed(3) + " / " + (pos[1] / screenY).toFixed(3) + " " + tradeItems.length, [pos[0] / screenX, pos[1] / screenY - 0.02], { + // font: 4, + // color: [255, 255, 255, 255], + // scale: [0.4, 0.4], + // outline: true, + //}); + ////----------------------------------------------------------DEBUG END + } + qw = 0; + if (showAdmin === true) { + pos = mp.gui.cursor.position; + + mp.game.graphics.set2dLayer(1); + //INVENTARHINTERGRUND + mp.game.graphics.drawRect(rxC, ryC, 0.45, 0.7, 255, 255, 255, 200); + + mp.game.graphics.set2dLayer(2); + //INVENTARÜBERSCHRIFT + mp.game.graphics.drawText("Inventar von ~y~" + targetPlayerName + " ~g~" + inventoryWeight + "/40000g", [rxC, ryC - (rWidth / 1.20)], { + font: 7, + color: [112, 128, 144, 254], + scale: [0.7, 0.7], + outline: true, + centre: false + }); + + //SLOTS [RECHTECKE] [SLOTZAHLEN] + for (slots = 0; slots < grid.length; slots++) { + mp.game.graphics.drawRect(grid[slots][0], grid[slots][1], sizeMulx, sizeMuly, 112, 128, 144, 254); + mp.game.graphics.drawText(tempSlot = slots + 1, [grid[slots][0] - sizeMulxHalf + 0.006, grid[slots][1] - (sizeMulxHalf * aspectRatioFactor)], { + font: 7, + color: [255, 69, 0, 254], + scale: [0.3, 0.3], + outline: true, + centre: false + }); + } + + mp.game.graphics.set2dLayer(3); + //SPRITES + ITEMANZAHL + for (currentItem = 0; currentItem < items.length; currentItem++) { + if (items[currentItem][4] !== "-1") { + mp.game.graphics.drawSprite("itemimages", items[currentItem][0].toLowerCase(), grid[items[currentItem][4] - 1][0], grid[items[currentItem][4] - 1][1], spriteScaleX, spriteScaleY, 0, 255, 255, 255, 255); + mp.game.graphics.drawText("(~y~" + items[currentItem][3] + "~s~)", [grid[items[currentItem][4] - 1][0] + sizeMulxHalf - 0.008, grid[items[currentItem][4] - 1][1] + 0.05], { + font: 0, + color: [255, 255, 255, 255], + scale: [0.25, 0.25], + outline: true, + centre: false + }); + } + } + + mp.game.graphics.set2dLayer(4); + //WENN MAUS ÜBER ITEM + if (isMouseOverItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) { + mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220); + + hoverItemP = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3]]; + + //NAME + mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.4, 0.4], + outline: true, + centre: false + }); + + //BESCHREIBUNG + mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.35, 0.35], + outline: true, + centre: false + }); + + //EINZELGEWICHT + mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.35, 0.35], + outline: true, + centre: false + }); + } + + if (isMouseOverX(pos[0], pos[1])) { + mp.game.graphics.drawSprite("itemimages", "x", closePos[0], closePos[1], 0.02, 0.035, 0, 220, 20, 60, 255); + } else { + mp.game.graphics.drawSprite("itemimages", "x", closePos[0], closePos[1], 0.02, 0.035, 0, 255, 255, 255, 255); + } + + } + }); + + function isMouseOverItem(cX, cY) { + + var x, y, a, b, c, s, invSlot; + x = cX / screenX; + y = cY / screenY; + + if (dragItem === null) { + for (s = 0; s < 20; s++) { + a = grid[s][0] - x; + b = grid[s][1] - y; + c = Math.sqrt(a * a + b * b); + invSlot = (s + 1); + if (c < sizeMulxHalf) { + for (var i = 0; i < items.length; i++) { + if (parseInt(items[i][4]) === invSlot) { + hoverItem = i; + return true; + } + } + } + } + } else { + if (itemRadial === false) { + for (s = 0; s < 20; s++) { + a = grid[s][0] - x; + b = grid[s][1] - y; + c = Math.sqrt(a * a + b * b); + invSlot = (s + 1); + if (c < sizeMulxHalf) { + for (i = 0; i < items.length; i++) { + if (parseInt(items[i][4]) === invSlot) { + hoverGrid = s; + return true; + } + } + } + } + } + } + } + function isMouseOverTradeItem(cX, cY) { + + if (dragItem === null && isTrading) { + + var x = cX / screenX; + var y = cY / screenY; + var a; + var b; + var c; + + for (var s = 0; s < 5; s++) { + a = tradeGrid[s][0] - x; + b = tradeGrid[s][1] - y; + c = Math.sqrt(a * a + b * b); + + var invSlot = (s + 1); + + if (c < sizeMulxHalf) { + for (var i = 0; i < tradeItems.length; i++) { + if (parseInt(tradeItems[i][4]) === invSlot) { + hoverItem = i; + return true; + } + } + } + } + } + } + + function isMouseOverFreeSlot(cX2, cY2) { + + var x = cX2 / screenX; + var y = cY2 / screenY; + var isItemOnSlot = 0; + + for (var s = 0; s < 20; s++) { + var invSlot = (s + 1); + + if (x > grid[s][0] - sizeMulxHalf && x < grid[s][0] + sizeMulxHalf && y > grid[s][1] - sizeMulxHalf * aspectRatioFactor && y < grid[s][1] + sizeMulxHalf * aspectRatioFactor) { + for (var i = 0; i < items.length; i++) { + if (parseInt(items[i][4]) === invSlot) { + isItemOnSlot++; + } + } + if (isItemOnSlot === 0) { + actFreeSlot = s + 1; + return true; + } + } + } + } + + function isMouseOverFreeTradeSlot(cX2, cY2) { + + if (tradeConfirm === false) { + var x = cX2 / screenX; + var y = cY2 / screenY; + var isItemOnSlot = 0; + + for (var s = 0; s < 5; s++) { + var invSlot = (s + 1); + + if (x > tradeGrid[s][0] - sizeMulxHalf && x < tradeGrid[s][0] + sizeMulxHalf && y > tradeGrid[s][1] - sizeMulxHalf * aspectRatioFactor && y < tradeGrid[s][1] + sizeMulxHalf * aspectRatioFactor) { + for (var i = 0; i < tradeItems.length; i++) { + if (parseInt(tradeItems[i][4]) === invSlot) { + isItemOnSlot++; + } + } + if (isItemOnSlot === 0) { + actFreeTradeSlot = s + 1; + return true; + } + } + } + } + } + + function isItemOverSameItem(cX2, cY2) { + + if (dragItem !== null && items.length > 0) { + var x = cX2 / screenX; + var y = cY2 / screenY; + + for (var s = 0; s < 20; s++) { + var invSlot = (s + 1); + + if (x > grid[s][0] - sizeMulxHalf && x < grid[s][0] + sizeMulxHalf && y > grid[s][1] - sizeMulxHalf * aspectRatioFactor && y < grid[s][1] + sizeMulxHalf * aspectRatioFactor) { + + for (var i = 0; i < items.length; i++) { + if (dragTradeItem === false) { + if (items[dragItem][0] === items[i][0] && parseInt(items[i][4]) === invSlot && items[hoverItem][4] !== items[i][4]) { + stackToItem = i; + return true; + } + } else { + if (tradeItems[dragItem][0] === items[i][0] && parseInt(items[i][4]) === invSlot) { + stackToItem = i; + return true; + } + } + } + } + } + } + } + + function isItemOverSameTradeItem(cX2, cY2) { + + if (dragItem !== null && tradeItems.length > 0) { + var x = cX2 / screenX; + var y = cY2 / screenY; + for (var s = 0; s < 5; s++) { + var invSlot = (s + 1); + + if (x > tradeGrid[s][0] - sizeMulxHalf && x < tradeGrid[s][0] + sizeMulxHalf && y > tradeGrid[s][1] - sizeMulxHalf * aspectRatioFactor && y < tradeGrid[s][1] + sizeMulxHalf * aspectRatioFactor) { + + for (var i = 0; i < tradeItems.length; i++) { + if (dragTradeItem === false) { + if (items[dragItem][0] === tradeItems[i][0] && parseInt(tradeItems[i][4]) === invSlot) { + stackToTradeItem = i; + return true; + } + } else { + if (tradeItems[dragItem][0] === tradeItems[i][0] && parseInt(tradeItems[i][4]) === invSlot && tradeItems[hoverItem][4] !== tradeItems[i][4]) { + stackToTradeItem = i; + return true; + } + } + } + } + } + } + } + + function isMouseOverX(cX2, cY2) { + if (showAdmin) { + var x = cX2 / screenX; + var y = cY2 / screenY; + + if (x > closePos[0] - 0.01 && x < closePos[0] + 0.01 && y > closePos[1] - 0.0175 && y < closePos[1] + 0.0175) { + return true; + } + } + } + + function isMouseOverTradeBox(cX2, cY2) { + if (show && tradeConfirm === false) { + var x = cX2 / screenX; + var y = cY2 / screenY; + + if (x > tradeBoxPos[0] - 0.01 && x < tradeBoxPos[0] + 0.01 && y > tradeBoxPos[1] - 0.0175 && y < tradeBoxPos[1] + 0.0175) { + return true; + } + } + } + + function isMouseOverTradeDollar(cX2, cY2) { + if (show && tradeConfirm === false) { + var x = cX2 / screenX; + var y = cY2 / screenY; + + if (x > (tradeBoxPos[0] - 0.025) - 0.01 && x < (tradeBoxPos[0] - 0.025) + 0.01 && y > tradeBoxPos[1] - 0.0175 && y < tradeBoxPos[1] + 0.0175) { + return true; + } + } + } + + function ifMouseSelectRadial(cX2, cY2) { + if (show && itemRadial === true) { + var x = cX2 / screenX; + var y = cY2 / screenY; + var a; + var b; + var c; + + //OBEN + if (x > grid[hoverGrid][0] - 0.0255 / aspectRatioFactor && x < grid[hoverGrid][0] + 0.0255 / aspectRatioFactor && y < grid[hoverGrid][1] - 0.065 && y > grid[hoverGrid][1] - 0.2) { + radialSelect = "up"; + radialDescription = "Wegwerfen"; + upRColor = 255; + return true; + } + //UNTEN + else if (x > grid[hoverGrid][0] - 0.0255 / aspectRatioFactor && x < grid[hoverGrid][0] + 0.0255 / aspectRatioFactor && y > grid[hoverGrid][1] + 0.065 && y < grid[hoverGrid][1] + 0.2) { + radialSelect = "down"; + radialDescription = "Benutzen / Essen"; + downRColor = 255; + return true; + } + ////LINKS + //else if (x > grid[hoverGrid][0] - 0.2 / aspectRatioFactor && x < grid[hoverGrid][0] - 0.065 / aspectRatioFactor && y < grid[hoverGrid][1] + 0.0255 && y > grid[hoverGrid][1] - 0.0255) { + // radialSelect = "left"; + // leftRColor = 255; + // return true; + //} + ////RECHTS + //else if (x < grid[hoverGrid][0] + 0.2 / aspectRatioFactor && x > grid[hoverGrid][0] + 0.065 / aspectRatioFactor && y < grid[hoverGrid][1] + 0.0255 && y > grid[hoverGrid][1] - 0.0255) { + // radialSelect = "right"; + // rightRColor = 255; + // return true; + else { + upRColor = 222; + downRColor = 222; + leftRColor = 222; + rightRColor = 222; + } + } + } + + + //Mausklick Events + mp.events.add('click', (x, y, upOrDown, leftOrRight, relativeX, relativeY, worldPosition, hitEntity) => { + + if (show) { + //LINKE MAUSTASTE + //RUNTER + if (upOrDown === "down" && leftOrRight === "left" && mouseLDown === false && mouseRDown === false) { + + mouseLDown = true; + + //Wenn Maus über grünen Haken + if (isTrading && isMouseOverTradeBox(x, y) && tradePrize > 0) { + tradeConfirm = true; + mp.events.callRemote('sendTradeItemsToPartner', JSON.stringify(tradeItems), tradePrize, tradePartner); + } + + //Wenn Maus über Dollar Zeichen + if (isTrading && isMouseOverTradeDollar(x, y)) { + globalData.InMenu = true; + var tradeMoney = new InputHelper("Wie viel $ möchtest du für deine Items haben?", globalData); + tradeMoney.show(); + tradeMoney.getValue((data) => { + var amount = parseInt(data); + if (isNaN(amount) || amount < 0) { + mp.game.graphics.notify('~r~Du musst eine Zahl größer als 0 eingeben!'); + return; + } + globalData.InMenu = false; + tradePrize = amount; + }); + } + + //Wenn Maus über Item + if (isMouseOverItem(x, y) && dragItem === null && itemRadial === false) { + dragItem = hoverItem; + oldDragSlot = items[dragItem][4]; + items[dragItem][4] = "-1"; + dragTradeItem = false; + } + //wenn Maus über Radialmenü + if (ifMouseSelectRadial(x, y)) { + switch (radialSelect) { + case "up": + var dropInput = new InputHelper("Wie viel Items möchtest du wegwerfen?", globalData); + globalData.InMenu = true; + dropInput.show(); + dropInput.getValue((data) => { + var amount = parseInt(data); + if (isNaN(amount) || amount < 1) { + mp.game.graphics.notify('~r~Du musst eine Zahl größer als 0 eingeben!'); + return; + } else if (amount > parseInt(items[clickedItem][3])) { + mp.game.graphics.notify('~r~So viele Items hast du nicht!'); + return; + } + mp.events.callRemote('itemInteract', "drop", items[clickedItem][5], amount); + }); + globalData.InMenu = false; + itemRadial = false; + break; + case "down": + mp.events.callRemote('itemInteract', "use", items[clickedItem][5], 1); + itemRadial = false; + break; + case "left": + itemRadial = false; + break; + case "right": + itemRadial = false; + break; + } + } + //Wenn Maus über Tradeitem + if (isMouseOverTradeItem(x, y) && dragItem === null && itemRadial === false && tradeConfirm === false) { + dragItem = hoverItem; + oldDragSlot = tradeItems[dragItem][4]; + tradeItems[dragItem][4] = "-1"; + dragTradeItem = true; + } + } + + //HOCH + if (upOrDown === "up" && leftOrRight === "left" && mouseLDown === true && itemRadial === false) { + + mouseLDown = false; + + if (dragItem !== null) { + var newAmount; + + //wenn Maus über freien Slot + if (isMouseOverFreeSlot(x, y)) { + if (dragTradeItem === false) { + items[dragItem][4] = actFreeSlot; + } else { + items.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], tradeItems[dragItem][3], actFreeSlot.toString(), tradeItems[dragItem][5]]); + tradeItems.splice(dragItem, 1); + } + syncCount++; + mp.events.callRemote('saveInventory', JSON.stringify(items)); + oldDragSlot = null; + dragItem = null; + hoverItem = null; + } else if (isItemOverSameItem(x, y)) { + if (dragTradeItem === false) { + newAmount = parseInt(items[stackToItem][3]) + parseInt(items[dragItem][3]); + items[stackToItem][3] = newAmount.toString(); + items[dragItem][4] = "-1"; + } else { + newAmount = parseInt(items[stackToItem][3]) + parseInt(tradeItems[dragItem][3]); + items[stackToItem][3] = newAmount.toString(); + tradeItems.splice(dragItem, 1); + } + syncCount++; + mp.events.callRemote('saveInventory', JSON.stringify(items)); + oldDragSlot = null; + dragItem = null; + hoverItem = null; + } else if (isItemOverSameTradeItem(x, y)) { + if (dragTradeItem === false) { + newAmount = parseInt(tradeItems[stackToTradeItem][3]) + parseInt(items[dragItem][3]); + tradeItems[stackToTradeItem][3] = newAmount.toString(); + items[dragItem][4] = "-1"; + } else { + newAmount = parseInt(tradeItems[stackToTradeItem][3]) + parseInt(tradeItems[dragItem][3]); + tradeItems[stackToTradeItem][3] = newAmount.toString(); + tradeItems[dragItem][4] = "-1"; + } + syncCount++; + mp.events.callRemote('saveInventory', JSON.stringify(items)); + oldDragSlot = null; + dragItem = null; + hoverItem = null; + } else if (isMouseOverFreeTradeSlot(x, y)) { + if (dragTradeItem === false) { + tradeItems.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], items[dragItem][3], actFreeTradeSlot.toString(), items[dragItem][5]]); + items.splice(dragItem, 1); + } else { + tradeItems[dragItem][4] = actFreeTradeSlot; + } + syncCount++; + mp.events.callRemote('saveInventory', JSON.stringify(items)); + oldDragSlot = null; + dragItem = null; + hoverItem = null; + } else { + if (dragTradeItem === false) { + items[dragItem][4] = oldDragSlot; + } else { + tradeItems[dragItem][4] = oldDragSlot; + } + oldDragSlot = null; + dragItem = null; + hoverItem = null; + } + } + } + + //RECHTE MAUSTASTE + //RUNTER + if (upOrDown === "down" && leftOrRight === "right" && mouseLDown === false && mouseRDown === false && itemRadial === false) { + clickTime = Date.now(); + mouseRDown = true; + + if (isMouseOverItem(x, y) && dragItem === null) { + dragItem = hoverItem; + oldDragSlot = items[hoverItem][4]; + bufferItem = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3], items[hoverItem][4], items[hoverItem][5]]; + items[hoverItem][3]--; + dragTradeItem = false; + } else if (isMouseOverTradeItem(x, y) && dragItem === null && tradeConfirm === false) { + dragItem = hoverItem; + oldDragSlot = tradeItems[hoverItem][4]; + bufferItem = [tradeItems[hoverItem][0], tradeItems[hoverItem][1], tradeItems[hoverItem][2], tradeItems[hoverItem][3], tradeItems[hoverItem][4], tradeItems[hoverItem][5]]; + tradeItems[hoverItem][3]--; + dragTradeItem = true; + } + } + + //HOCH + if (upOrDown === "up" && leftOrRight === "right" && mouseRDown === true && itemRadial === false) { + mouseRDown = false; + if (Date.now() - clickTime < 100 && isMouseOverItem(x, y)) { + clickedItem = hoverItem; + items[hoverItem][3]++; + itemRadial = true; + hoverItem = null; + dragItem = null; + clickTime = null; + } else { + if (dragItem !== null) { + if (isMouseOverFreeSlot(x, y)) { + if (dragTradeItem === false) { + items.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], "1", actFreeSlot.toString(), "-1"]); + if (items[hoverItem][3] === 0) { + items[hoverItem][4] = "-1"; + items.splice(hoverItem, 1); + } + } else { + items.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], "1", actFreeSlot.toString(), "-1"]); + if (tradeItems[hoverItem][3] === 0) { + tradeItems.splice(hoverItem, 1); + } + } + syncCount++; + mp.events.callRemote('saveInventory', JSON.stringify(items)); + oldDragSlot = null; + dragItem = null; + hoverItem = null; + } else if (isItemOverSameItem(x, y)) { + items[stackToItem][3]++; + if (dragTradeItem === false) { + if (items[hoverItem][3] === 0) { + items[hoverItem][4] = "-1"; + } + } else { + if (tradeItems[hoverItem][3] === 0) { + tradeItems.splice(hoverItem, 1); + } + } + syncCount++; + mp.events.callRemote('saveInventory', JSON.stringify(items)); + bufferItem = null; + dragItem = null; + hoverItem = null; + oldDragSlot = null; + } else if (isItemOverSameTradeItem(x, y)) { + tradeItems[stackToTradeItem][3]++; + if (dragTradeItem === false) { + if (items[hoverItem][3] === 0) { + items[hoverItem][4] = "-1"; + } + } else { + if (tradeItems[hoverItem][3] === 0) { + tradeItems[hoverItem][4] = "-1"; + } + } + syncCount++; + mp.events.callRemote('saveInventory', JSON.stringify(items)); + oldDragSlot = null; + bufferItem = null; + dragItem = null; + hoverItem = null; + } else if (isMouseOverFreeTradeSlot(x, y)) { + if (dragTradeItem === false) { + tradeItems.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], "1", actFreeTradeSlot.toString(), "-1"]); + if (items[hoverItem][3] === 0) { + items[hoverItem][4] = "-1"; + } + } else { + tradeItems.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], "1", actFreeTradeSlot.toString(), "-1"]); + if (tradeItems[hoverItem][3] === 0) { + tradeItems[hoverItem][4] = "-1"; + } + } + syncCount++; + mp.events.callRemote('saveInventory', JSON.stringify(items)); + oldDragSlot = null; + dragItem = null; + hoverItem = null; + } else { + if (dragTradeItem === false) { + items[hoverItem][3]++; + } else { + tradeItems[hoverItem][3]++; + } + oldDragSlot = null; + bufferItem = null; + dragItem = null; + hoverItem = null; + } + } + } + } + } + if (showAdmin) { + //LINKE MAUSTASTE + //RUNTER + if (upOrDown === "down" && leftOrRight === "left" && mouseLDown === false && mouseRDown === false) { + + if (isMouseOverItem(x, y)) { + items[hoverItem][4] = "-1"; + inventoryWeight -= parseInt(items[hoverItem][2]) * parseInt(items[hoverItem][3]); + mp.events.callRemote('removeItemAsAdmin', "stack", items[hoverItem][5], targetPlayerName); + } else if (isMouseOverX(x, y)) { + mp.gui.chat.activate(true); + mp.gui.cursor.show(false, false); + showAdmin = false; + mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("itemimages"); + inventoryWeight = 0; + items = null; + } + } + + //RECHTE MAUSTASTE + //RUNTER + if (upOrDown === "down" && leftOrRight === "right" && mouseLDown === false && mouseRDown === false) { + + if (isMouseOverItem(x, y)) { + items[hoverItem][3]--; + mp.events.callRemote('removeItemAsAdmin', "one", items[hoverItem][5], targetPlayerName); + if (items[hoverItem][3] === 0) { + items[hoverItem][4] = "-1"; + } + inventoryWeight -= items[hoverItem][2]; + } + } + } + }); +} \ No newline at end of file diff --git a/ReallifeGamemode.Client/Gui/infobox.ts b/ReallifeGamemode.Client/Gui/infobox.ts index be4c2555..74f48eeb 100644 --- a/ReallifeGamemode.Client/Gui/infobox.ts +++ b/ReallifeGamemode.Client/Gui/infobox.ts @@ -202,7 +202,7 @@ export default function (globalData: IGlobalData): void { centre: false }) - mp.game.graphics.drawText(dateString + "\n" + timeString, [0.938, 0.381], + mp.game.graphics.drawText(timeString + "\n" + dateString, [0.938, 0.381], { font: 4, color: [255, 255, 255, 255], @@ -219,7 +219,7 @@ export default function (globalData: IGlobalData): void { outline: true, centre: false }) - mp.game.graphics.drawText("~r~Datum: ", [0.89, 0.381], + mp.game.graphics.drawText("~r~Datum: ", [0.891, 0.411], { font: 4, color: [255, 255, 255, 255], @@ -227,7 +227,7 @@ export default function (globalData: IGlobalData): void { outline: true, centre: false }) - mp.game.graphics.drawText("~r~Uhrzeit: ", [0.891, 0.411], + mp.game.graphics.drawText("~r~Uhrzeit: ", [0.89, 0.381], { font: 4, color: [255, 255, 255, 255], diff --git a/ReallifeGamemode.Client/Gui/nametags.ts b/ReallifeGamemode.Client/Gui/nametags.ts index c780693d..7fee2fc4 100644 --- a/ReallifeGamemode.Client/Gui/nametags.ts +++ b/ReallifeGamemode.Client/Gui/nametags.ts @@ -1,7 +1,6 @@ import { IGame, IEntity } from "../game"; import game from ".."; - const maxDistance = 40 * 40; const width = 0.03; const height = 0.0065; @@ -27,9 +26,7 @@ const colors = [ { id: 9, color: [0, 166, 133, alpha] }, //news ]; - export default function customNametags() { - mp.nametags.enabled = false; mp.events.add('render', (nametags) => { @@ -67,19 +64,19 @@ export default function customNametags() { let y2 = y + 0.042; if (armour > 0) { - graphics.drawRect(x, y2, width + border * 2, height + border * 2, 0 , 0, 0, 200); - graphics.drawRect(x, y2, width, height, 150, 150, 150, 255); + graphics.drawRect(x, y2, width + border * 2, height + border * 2, 0, 0, 0, 200); + graphics.drawRect(x, y2, width, height, 50, 0, 0, 255); graphics.drawRect(x - width / 2 * (1 - health), y2, width * health, height, 200, 0, 0, 200); var x2 = x + width / 2 + border / 2; graphics.drawRect(x, y2 + height, width + border * 2, height + border * 2, 0, 0, 0, 200); - graphics.drawRect(x, y2 + height, width, height, 200, 200, 200, 255); + graphics.drawRect(x, y2 + height, width, height, 80, 80, 80, 255); graphics.drawRect(x - width / 2 * (1 - armour), y2 + height, width * armour, height, 255, 255, 255, 200); } else { graphics.drawRect(x, y2, width + border * 2, height + border * 2, 0, 0, 0, 200); - graphics.drawRect(x, y2, width, height, 150, 150, 150, 255); + graphics.drawRect(x, y2, width, height, 50, 0, 0, 255); graphics.drawRect(x - width / 2 * (1 - health), y2, width * health, height, 200, 0, 0, 200); } } diff --git a/ReallifeGamemode.Client/Interaction/factioninteraction.ts b/ReallifeGamemode.Client/Interaction/factioninteraction.ts index 392030df..facb710b 100644 --- a/ReallifeGamemode.Client/Interaction/factioninteraction.ts +++ b/ReallifeGamemode.Client/Interaction/factioninteraction.ts @@ -313,7 +313,7 @@ export default function factionInteraction(globalData: IGlobalData) { } else { if (tasks[index].MedicName === "none") { mp.game.graphics.requestStreamedTextureDict("medicimages", true); - mp.events.callRemote("updateMedicTask", 0, index); + mp.events.callRemote("updateMedicTask", 0, tasks[index].Victim); mp.game.ui.setNewWaypoint(tasks[index].Position.x, tasks[index].Position.y); activeCheckpoint = mp.checkpoints.new(1, new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 2), 3.0, { @@ -367,7 +367,7 @@ export default function factionInteraction(globalData: IGlobalData) { } else { if (tasks[index].MedicName === "none") { mp.game.graphics.requestStreamedTextureDict("medicimages", true); - mp.events.callRemote("updateMedicTask", 1, index); + mp.events.callRemote("updateMedicTask", 1, tasks[index].Victim); mp.game.ui.setNewWaypoint(tasks[index].Position.x, tasks[index].Position.y); activeCheckpoint = mp.checkpoints.new(1, new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 2), 3.0, { diff --git a/ReallifeGamemode.Client/Interaction/interactionmenu.ts b/ReallifeGamemode.Client/Interaction/interactionmenu.ts index d664ecf3..53eddcd8 100644 --- a/ReallifeGamemode.Client/Interaction/interactionmenu.ts +++ b/ReallifeGamemode.Client/Interaction/interactionmenu.ts @@ -27,6 +27,8 @@ export default function (globalData: IGlobalData) { var groupItem = new UIMenuItem("Gruppe", "Verwalte deine Gruppe"); + var jobItem = new UIMenuItem("Job", "Infos zu deinem Job"); + var paycheckItem = new UIMenuItem("Gehaltsscheck", "Schaue dir deinen Verdienst der letzten Stunde an"); var licenseItem = new UIMenuItem("Lizenzen", "Lizenzen Informationen"); @@ -41,10 +43,11 @@ export default function (globalData: IGlobalData) { var groupRank = null; - mp.events.add("SERVER:InteractionMenu_OpenMenu", (accountDataJson: string, factionleader: string, faction: string, group: string, factionInvite: boolean, groupInvite: boolean, ticket_boolean: boolean, ticket_amount, house: boolean) => { + mp.events.add("SERVER:InteractionMenu_OpenMenu", (accountDataJson: string, factionleader: string, jobDataJson: string, faction: string, group: string, factionInvite: boolean, groupInvite: boolean, ticket_boolean: boolean, ticket_amount, house: boolean) => { var accountData: AccountData = JSON.parse(accountDataJson); + var jobData: JobData = JSON.parse(jobDataJson); //var ticket_amount = JSON.parse(ticket_amountJson); var menu = getInteractionMenu(); @@ -77,6 +80,8 @@ export default function (globalData: IGlobalData) { menu.AddItem(factionleaderItem); menu.BindMenuToItem(getFactionLeaderMenu(faction, accountData.factionVehicles, accountData.stateFaction, menu), factionleaderItem); } + menu.AddItem(jobItem); + menu.BindMenuToItem(getJobMenu(jobData, menu), jobItem); if (group) { groupItem.SetRightLabel(group); @@ -206,11 +211,7 @@ export default function (globalData: IGlobalData) { menuItem = new UIMenuItem("Fraktionsrang"); menuItem.SetRightLabel(data.factionRank); accountMenu.AddItem(menuItem); - } - - menuItem = new UIMenuItem("Job"); - menuItem.SetRightLabel(data.job); - accountMenu.AddItem(menuItem); + } if (data.group != null) { menuItem = new UIMenuItem("Gruppe"); @@ -365,6 +366,67 @@ export default function (globalData: IGlobalData) { return factionMenu; } + function getJobMenu(jobdata: JobData, parentMenu: NativeUI.Menu): NativeUI.Menu { + var jobMenu = new NativeUI.Menu("Job", "Job Infos / Skillpunkte", new Point(0, screenRes.y / 3), null, null); + + var pilotLevel; + var busLevel; + + if (jobdata.pilotskill >= 300) { + pilotLevel = 2; + } else { + pilotLevel = 1; + } + + if (jobdata.busskill >= 800) { + busLevel = 3; + } else if (jobdata.busskill >= 300) { + busLevel = 2; + } else { + busLevel = 1; + } + + var actJobItem = new UIMenuItem("Aktueller Job:"); + actJobItem.SetRightLabel(jobdata.job) + jobMenu.AddItem(actJobItem); + + var pilotSkillItem = new UIMenuItem("Pilot Skill (LVL " + pilotLevel + ")"); + switch (pilotLevel) { + case 1: + pilotSkillItem.SetRightLabel(jobdata.pilotskill + "/300") + break; + case 2: + pilotSkillItem.SetRightLabel(jobdata.pilotskill + "/MAX") + break; + } + jobMenu.AddItem(pilotSkillItem); + + var busSkillItem = new UIMenuItem("Bus Skill (LVL " + busLevel + ")"); + switch (busLevel) { + case 1: + busSkillItem.SetRightLabel(jobdata.busskill + "/300") + break; + case 2: + busSkillItem.SetRightLabel(jobdata.busskill + "/800") + break; + case 3: + busSkillItem.SetRightLabel(jobdata.busskill + "/MAX") + break; + } + jobMenu.AddItem(busSkillItem); + + var wageItem = new UIMenuItem("Verdienst"); + if (jobdata.wage > 0) { + wageItem.SetRightLabel("~g~$" + jobdata.wage.toString()) + } else { + wageItem.SetRightLabel("$" + jobdata.wage.toString()) + } + jobMenu.AddItem(wageItem); + jobMenu.Visible = false; + mp.gui.chat.show(false); + return jobMenu; + } + function getGroupMenu(group: string, parentMenu: NativeUI.Menu): NativeUI.Menu { var groupMenu = new NativeUI.Menu("Gruppe", group, new Point(0, screenRes.y / 3), null, null); if (groupRank == "Manager" || groupRank == "Besitzer") groupMenu.AddItem(new UIMenuItem("Spieler einladen")); diff --git a/ReallifeGamemode.Client/Player/keys.ts b/ReallifeGamemode.Client/Player/keys.ts index f4c11e13..9c344a16 100644 --- a/ReallifeGamemode.Client/Player/keys.ts +++ b/ReallifeGamemode.Client/Player/keys.ts @@ -6,11 +6,10 @@ //https://docs.microsoft.com/de-de/windows/desktop/inputdev/virtual-key-codes - -const player = mp.players.local; +import { Key } from '../game'; +import KeyBinder from 'ragemp-better-bindings'; export default function keys(globalData: IGlobalData) { - var showGui = true; //ENTER @@ -73,7 +72,6 @@ export default function keys(globalData: IGlobalData) { } }); - //I //Inventar mp.keys.bind(0x49, false, function () { if (!globalData.InChat && !globalData.InTuning) { @@ -83,9 +81,9 @@ export default function keys(globalData: IGlobalData) { //O //Spielerliste mp.keys.bind(0x4F, true, function () { - if (!globalData.InChat && !globalData.InTuning ) { + if (!globalData.InChat && !globalData.InTuning) { mp.events.callRemote("keyPress:O"); - //mp.events.call("showPlayerlist"); + //mp.events.call("showPlayerlist"); } }); @@ -113,7 +111,7 @@ export default function keys(globalData: IGlobalData) { //N //Motor Starten mp.keys.bind(0x4E, false, function () { if (!globalData.InChat) { - mp.events.callRemote("keyPress:N"); + mp.events.callRemote("keyPress:N"); } }); @@ -143,9 +141,13 @@ export default function keys(globalData: IGlobalData) { mp.gui.takeScreenshot(new Date().toLocaleDateString(), 1, 100, 80); }); + KeyBinder.bind("ctrl+h", () => { + mp.events.callRemote("keyPress:ControllH"); //hup + return; + }); + //F2 //Noclip mp.keys.bind(0x71, false, () => { - mp.events.callRemote("Noclip"); - + mp.events.callRemote("Noclip"); }); } \ No newline at end of file diff --git a/ReallifeGamemode.Client/core/rage-mp/entities.ts b/ReallifeGamemode.Client/core/rage-mp/entities.ts index 537c765e..9073acc4 100644 --- a/ReallifeGamemode.Client/core/rage-mp/entities.ts +++ b/ReallifeGamemode.Client/core/rage-mp/entities.ts @@ -249,6 +249,13 @@ class RageVehicle extends RageEntity implements IVehicle { this.vehicle.setDoorShut(door, instantly); } + + get class(): number { + if (mp.vehicles.exists(this.vehicle)) { + return this.vehicle.getClass(); + } + return -1; + } } diff --git a/ReallifeGamemode.Client/game.ts b/ReallifeGamemode.Client/game.ts index 84d9f67c..db02729b 100644 --- a/ReallifeGamemode.Client/game.ts +++ b/ReallifeGamemode.Client/game.ts @@ -69,6 +69,7 @@ interface IVehicle extends IEntity { setDoorsLocked(state: boolean); setDoorShut(door: number, instantly: boolean); setDoorOpen(door: number, loose: boolean, instantly: boolean); + class: number; } interface IEntityPool { diff --git a/ReallifeGamemode.Client/global.d.ts b/ReallifeGamemode.Client/global.d.ts index 266c36d6..118dc77c 100644 --- a/ReallifeGamemode.Client/global.d.ts +++ b/ReallifeGamemode.Client/global.d.ts @@ -14,7 +14,6 @@ declare type AccountData = { factionRank: string; group: string; groupRank: string; - job: string; paycheck: Paycheck; licenses: Licenses; vehicles: VehicleData[]; @@ -25,6 +24,13 @@ declare type AccountData = { userWarn: number; } +declare type JobData = { + job: string; + busskill: number; + pilotskill: number; + wage: number; +} + declare type VehicleData = { Id: number; Model: number; @@ -44,6 +50,8 @@ declare type Paycheck = { otheramount: number; } + + declare type Licenses = { drivingLicenseCar: boolean; drivingLicenseBike: boolean; diff --git a/ReallifeGamemode.Client/index.ts b/ReallifeGamemode.Client/index.ts index 70a08959..6dd166b9 100644 --- a/ReallifeGamemode.Client/index.ts +++ b/ReallifeGamemode.Client/index.ts @@ -7,14 +7,13 @@ import { IGame } from './game'; import RageGame from './core/rage-mp/game'; - var inMenu: boolean = false; let globalData: IGlobalData = { InTuning: false, HideGui: false, InChat: false, - LoggedIn: false, + LoggedIn: false, get InMenu(): boolean { return inMenu; @@ -224,7 +223,6 @@ refuseCollector(); import PedCreator from './Ped/PedCreator'; PedCreator(); - import attachmentManager from './util/attachmentMngr'; attachmentManager(game); @@ -235,14 +233,12 @@ import bankMenuHandle from './Interaction/bankmenu'; import InputHelper from './inputhelper'; bankMenuHandle(globalData); - import ahelp from './Gui/ahelp'; ahelp(globalData); import Introduction from './Gui/introduction'; Introduction(globalData); - import userhelp from './Gui/userhelp'; userhelp(globalData); @@ -252,6 +248,9 @@ drivingschool(globalData); import gangwarHandle from './util/Gangwar'; gangwarHandle(globalData); +import animationSync from './util/animationSync'; +animationSync(); + require('./Gui/policedepartment'); require('./Gui/helptext'); @@ -262,6 +261,4 @@ interface VehicleData { export { VehicleData -} - - +} \ No newline at end of file diff --git a/ReallifeGamemode.Client/package-lock.json b/ReallifeGamemode.Client/package-lock.json index e523848f..fae2ae51 100644 --- a/ReallifeGamemode.Client/package-lock.json +++ b/ReallifeGamemode.Client/package-lock.json @@ -2879,6 +2879,11 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, + "ragemp-better-bindings": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ragemp-better-bindings/-/ragemp-better-bindings-1.0.4.tgz", + "integrity": "sha512-mev0UT74EmBen1rdg8FP9bKFsxUtDH56X2SM2JQQsWWzCzVvRP0HIt1Wqn1DuomszgSt/uzxZaufwCFbeOU+/Q==" + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", diff --git a/ReallifeGamemode.Client/package.json b/ReallifeGamemode.Client/package.json index 0c0b26ac..501e5304 100644 --- a/ReallifeGamemode.Client/package.json +++ b/ReallifeGamemode.Client/package.json @@ -22,5 +22,8 @@ "ProjectOpened": [ "watch" ] + }, + "dependencies": { + "ragemp-better-bindings": "^1.0.4" } } diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts new file mode 100644 index 00000000..169a070b --- /dev/null +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -0,0 +1,155 @@ +import { debug } from "util"; + +export default function animationSync() { + let blockInput = false; + let animationBreakTimer; + + mp.events.add("SERVER:LoadAnimations", () => { + animationSyncData.register("Cuffed", "mp_arresting", "idle", -1, true, 50, false); + animationSyncData.register("doArrest", "mp_arrest_paired", "cop_p2_back_right", 3760, false, 0, false); + animationSyncData.register("getArrest", "mp_arrest_paired", "crook_p2_back_right", 3760, false, 0, false); + animationSyncData.register("doUncuff", "mp_arresting", "a_uncuff", 5500, false, 0, false); + animationSyncData.register("getUncuff", "mp_arresting", "b_uncuff", 5500, false, 0, false); + animationSyncData.register("hup", "mp_am_hold_up", "handsup_base", -1, true, 50, true); + animationSyncData.register("carryBox", "anim@heists@box_carry@", "idle", -1, true, 50, true); + }); + + const animationBreakMessage = [ + { animName: "Cuffed", msg: "Handschellen gebrochen." } + ]; + + const animationSyncData = + { + animations: [], + + register: function (name, animDict, animName, duration, loop, flag, endless) { + let id = mp.game.joaat(name); + + if (!this.animations.hasOwnProperty(id)) { + this.animations[id] = + { + id: id, + name: name, + animDict: animDict, + animName: animName, + duration: duration, + loop: loop, + flag: flag, + endless: endless + }; + } else { + mp.game.graphics.notify("Animation Sync Error: ~r~Duplicate Entry"); + } + } + }; + + /* + mp.events.add("entityStreamIn", (entity) => { + if (entity.type === "player" && entity.animationData) { + if (!entity.animationData.playOnStream) + return; + animationSync.playAnim(entity, mp.game.joaat(entity.animationData.name)); + } + }); + */ + + setInterval(() => { + if (mp.players.local.getVariable("AnimationData")) { + let index = mp.game.joaat(mp.players.local.getVariable("AnimationData")); + let currentAnim = animationSyncData.animations[index]; + let { id, name, animDict, animName, duration, loop, flag } = currentAnim; + if (loop) { + blockInput = true; + } else { + blockInput = false; + } + } + + mp.players.forEachInStreamRange( + (player) => { + if (!player.getVariable("AnimationData")) { + return; + } + + let index = mp.game.joaat(player.getVariable("AnimationData")); + + let currentAnim = animationSyncData.animations[index]; + let { id, name, animDict, animName, duration, loop, flag } = currentAnim; + + if (loop == true && !player.isPlayingAnim(animDict, animName, 3)) { + loadAnimDict(animDict, function () { + mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) + }); + } + }); + }, 100); + + mp.events.addDataHandler("AnimationData", (entity, string) => { + entity.clearTasksImmediately(); + if (animationBreakTimer) { + clearInterval(animationBreakTimer); + animationBreakTimer = null; + } + if (string == null) { + blockInput = false; + return; + } + + let index = mp.game.joaat(string); + + if (!animationSyncData.animations.hasOwnProperty(index)) return; + + let animData = animationSyncData.animations[index]; + + let { id, name, animDict, animName, duration, loop, flag, endless } = animData; + + loadAnimDict(animDict, function () { + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) + }); + + if (mp.players.local == entity) { + if (!endless) { + animationBreakTimer = setInterval(() => breakAnimation(name), 120000); + } + + if (!loop) { + let a = setInterval(function () { + clearInterval(a); + mp.game.wait(500); + mp.events.callRemote("CLIENT:ClearAnimationData", true); + }, duration); + } + } + }); + + function breakAnimation(name) { + let { animName, msg } = animationBreakMessage.find(c => c.animName == name) + + if (msg) + mp.events.call("renderTextOnScreen", msg); + + clearInterval(animationBreakTimer); + animationBreakTimer = null; + mp.events.callRemote("CLIENT:ClearAnimationData", false); + } + + mp.events.add("render", () => { + if (blockInput) { + mp.game.controls.disableControlAction(32, 25, true); + mp.game.controls.disableControlAction(32, 24, true); + mp.game.controls.disableControlAction(32, 22, true); + } + }); + + function loadAnimDict(animDict, callback) { + if (mp.game.streaming.hasAnimDictLoaded(animDict)) return void callback(); + mp.game.streaming.requestAnimDict(animDict); + let c = setInterval(function () { + mp.game.streaming.hasAnimDictLoaded(animDict) && (clearInterval(c), callback()) + }, 100) + } + + mp.events.add("SERVER:SetInFrontPosition", (entity) => { + mp.events.callRemote("CLIENT:SET_InFrontOfPos", entity.getOffsetFromInWorldCoords(0, 1, 0)); + }); +} \ No newline at end of file diff --git a/ReallifeGamemode.Client/util/attachmentMngr.ts b/ReallifeGamemode.Client/util/attachmentMngr.ts index b3f0a1d9..bb62ee5d 100644 --- a/ReallifeGamemode.Client/util/attachmentMngr.ts +++ b/ReallifeGamemode.Client/util/attachmentMngr.ts @@ -1,6 +1,5 @@ import { IGame, IEntity } from "../game"; - export default function attachmentManager(game: IGame) { mp.events.add("SERVER:LoadAttachments", () => { attachmentMngr.register("char_creator_1", "prop_beggers_sign_04", 28422, new mp.Vector3(0, 0, 0), new mp.Vector3(0, 0, 0)); @@ -9,11 +8,10 @@ export default function attachmentManager(game: IGame) { attachmentMngr.register("weapondeal", "ex_prop_crate_ammo_bc", "chassis_dummy", new mp.Vector3(0.08, -0.9, -0.2), new mp.Vector3(0, 0, 0)); attachmentMngr.register("weapondeal1", "ex_office_swag_guns02", "chassis_dummy", new mp.Vector3(0, 0.8, 0), new mp.Vector3(0, 0, 0)); attachmentMngr.register("weapondeal2", "w_sg_pumpshotgun", "chassis_dummy", new mp.Vector3(0.4, 1.6, 0.62), new mp.Vector3(90, 0, 180)); + attachmentMngr.register("handcuffs", "p_cs_cuffs_02_s", 28422, new mp.Vector3(-0.05, 0, 0), new mp.Vector3(90, 90, 0)); }); - - - const attachmentMngr = + const attachmentMngr = { attachments: {}, @@ -26,7 +24,7 @@ export default function attachmentManager(game: IGame) { let attInfo = this.attachments[id]; let object = mp.objects.new(attInfo.model, entity.position); - + object.__attMgrData = { targetEntity: entity.handle, bone: (typeof (attInfo.boneName) === 'string') ? entity.getBoneIndexByName(attInfo.boneName) : entity.getBoneIndex(attInfo.boneName), diff --git a/ReallifeGamemode.Client/util/weapondamage.ts b/ReallifeGamemode.Client/util/weapondamage.ts index eae20da7..c60d0c01 100644 --- a/ReallifeGamemode.Client/util/weapondamage.ts +++ b/ReallifeGamemode.Client/util/weapondamage.ts @@ -21,86 +21,74 @@ let modifier = 1; let meelemodifier = 1; + blockInput = (mp.game.weapon.getWeapontypeGroup(player.weapon) != 2685387236); + switch (player.weapon) { case 0x1B06D571: //Pistol modifier = 0.4; meelemodifier = 1; - blockInput = true; + //mp.gui.chat.push("PistolModifier: " + modifier); break; case 0xBFE256D4: //Pistol_MK2 modifier = 0.4; meelemodifier = 1; - blockInput = true; break; case 0x5EF9FEC4: //Combatpistol modifier = 0.5; meelemodifier = 1; - blockInput = true; break; case 0x99AEEB3B: //Pistol50 modifier = 0.35; meelemodifier = 1; - blockInput = true; break; case 0x2BE6766B: //SMG modifier = 0.25; meelemodifier = 1; - blockInput = true; break; case 0x1D073A89: //Pumpshotgun modifier = 0.2; meelemodifier = 1; - blockInput = true; break; case 0x83BF0278: //Cabinerifle modifier = 0.2; meelemodifier = 1; - blockInput = true; break; case 0x624FE830: //Compactrifle modifier = 0.2; meelemodifier = 0.1; - blockInput = true; break; case 0x05FC3C11: //Sniperrifle modifier = 0.5; meelemodifier = 1; - blockInput = true; break; case 0xA2719263: //Meele Umarmed Fist meelemodifier = 0.1; modifier = 1; - blockInput = false; //mp.gui.chat.push("FistModifier: " + meelemodifier); break; case 0x958A4A8F: //Meele Baseball Bat meelemodifier = 0.15; modifier = 1; - blockInput = false; break; case 0x8BB05FD7: //Meele Flashlight meelemodifier = 0.1; modifier = 1; - blockInput = false; break; case 0xD8DF3C3C: //Meele Knuckle meelemodifier = 0.1; modifier = 1; - blockInput = false; //mp.gui.chat.push("KnuckleModifier: " + meelemodifier); break; case 0x678B81B1: //Meele Nightstick meelemodifier = 0.1; modifier = 1; - blockInput = false; break; default: modifier = 1; meelemodifier = 1; - blockInput = false; break; } diff --git a/ReallifeGamemode.Client/vehiclesync/smoothtrottle.ts b/ReallifeGamemode.Client/vehiclesync/smoothtrottle.ts index fb57d81c..e11a060e 100644 --- a/ReallifeGamemode.Client/vehiclesync/smoothtrottle.ts +++ b/ReallifeGamemode.Client/vehiclesync/smoothtrottle.ts @@ -9,7 +9,7 @@ export default function smoothThrottle() { let GlobalDisable = false; - let DisableAntiReverse = true; + let DisableAntiReverse = false; let DisableSmoothThrottle = false; let BrakeSystem = false; @@ -47,7 +47,7 @@ export default function smoothThrottle() { return; if (BrakeSystem) { - if (mp.players.local.vehicle !== null) { + if (mp.players.local.vehicle && mp.vehicles.exists(mp.players.local.vehicle)) { if (!mp.players.local.vehicle.isSeatFree(-1)) //only do this if the vehicle has a driver (doesn't have to be the player who is rendering this) { //Optimize function calls to variables (probably doesn't make a difference) diff --git a/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts b/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts index 351b723e..f7989e42 100644 --- a/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts +++ b/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts @@ -16,9 +16,9 @@ game.events.onPlayerEnterVehicle(async (vehicle, seat) => { } if (vehicle) { - var data: VehicleData = vehicle.getSharedData("VehicleData"); - + var data: VehicleData = vehicle.getSharedData("VehicleData"); setVehicleData(vehicle, data); + if (vehicle.class == 16) mp.game.vehicle.defaultEngineBehaviour = true; } }); @@ -31,8 +31,8 @@ game.events.onPlayerExitVehicle(async () => { if (veh) { var data: VehicleData = veh.getSharedData("VehicleData"); - setVehicleData(veh, data); + if (veh.class == 16) mp.game.vehicle.defaultEngineBehaviour = false; } }); diff --git a/ReallifeGamemode.Database/Migrations/20210405190220_UserNameUniqueIndex.Designer.cs b/ReallifeGamemode.Database/Migrations/20210405190220_UserNameUniqueIndex.Designer.cs new file mode 100644 index 00000000..0da9a04a --- /dev/null +++ b/ReallifeGamemode.Database/Migrations/20210405190220_UserNameUniqueIndex.Designer.cs @@ -0,0 +1,1885 @@ +// +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("20210405190220_UserNameUniqueIndex")] + partial class UserNameUniqueIndex + { + 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.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.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.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.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.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.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.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.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.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/20210405190220_UserNameUniqueIndex.cs b/ReallifeGamemode.Database/Migrations/20210405190220_UserNameUniqueIndex.cs new file mode 100644 index 00000000..35e77a9a --- /dev/null +++ b/ReallifeGamemode.Database/Migrations/20210405190220_UserNameUniqueIndex.cs @@ -0,0 +1,23 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace ReallifeGamemode.Database.Migrations +{ + public partial class UserNameUniqueIndex : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateIndex( + name: "IX_Users_Name", + table: "Users", + column: "Name", + unique: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_Users_Name", + table: "Users"); + } + } +} diff --git a/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs b/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs index b502af3e..1a9d86a2 100644 --- a/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs +++ b/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs @@ -1463,6 +1463,9 @@ namespace ReallifeGamemode.Database.Migrations b.HasIndex("HouseId"); + b.HasIndex("Name") + .IsUnique(); + b.ToTable("Users"); }); diff --git a/ReallifeGamemode.Database/Models/DatabaseContext.cs b/ReallifeGamemode.Database/Models/DatabaseContext.cs index af7eca89..63a65d63 100644 --- a/ReallifeGamemode.Database/Models/DatabaseContext.cs +++ b/ReallifeGamemode.Database/Models/DatabaseContext.cs @@ -1,4 +1,6 @@ -using Microsoft.EntityFrameworkCore; +using System; +using System.Linq; +using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Logging; @@ -43,10 +45,16 @@ namespace ReallifeGamemode.Database.Models .HasIndex(b => b.BusinessId) .IsUnique(true); - modelBuilder.Entity() - .HasIndex(u => u.BusinessId) + modelBuilder.Entity(e => + { + e.HasIndex(u => u.BusinessId) .IsUnique(true); + e.HasIndex(u => u.Name) + .IsUnique(true); + }); + + modelBuilder.Entity() .Property(sv => sv.Active) .HasDefaultValue(true); diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 551d092d..041f31dc 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -34,6 +34,17 @@ namespace ReallifeGamemode.Server.Commands { #region Todo + [Command("syncanim", "~m~Benutzung: ~s~/syncanim [animName]")] + public void CmdSyncAnim(Player player, string animName = null) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + player.SyncAnimation(animName); + } + [Command("anim", "~m~Benutzung: ~s~/anim [animDict] [animName]")] public void CmdAnim(Player player, string animDict, string animName) { @@ -43,11 +54,8 @@ namespace ReallifeGamemode.Server.Commands return; } NAPI.Player.PlayPlayerAnimation(player, (int)(AnimationFlags.Loop | AnimationFlags.AllowPlayerControl | AnimationFlags.Cancellable), animDict, animName); - } - - [Command("eat", "~m~Benutzung: ~s~/eat [Item]")] public void CmdAdminEat(Player player, string item) { @@ -144,36 +152,38 @@ namespace ReallifeGamemode.Server.Commands #region ahelp - /* [Command("ahelp", "~m~Benutzung: ~s~/ahelp")] - public void CmdAdminHelp(Player player) - { - if (!player.GetUser()?.IsAdmin(AdminLevel.MAPPING) ?? true) - { - ChatService.NotAuthorized(player); - return; - } - else - { - switch (player.GetUser().AdminLevel) - { - case AdminLevel.MAPPING: - ChatService.SendMessage(player, "~b~ " + "/team, /tc, /position"); - break; + /* [Command("ahelp", "~m~Benutzung: ~s~/ahelp")] + public void CmdAdminHelp(Player player) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.MAPPING) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + else + { + switch (player.GetUser().AdminLevel) + { + case AdminLevel.MAPPING: + ChatService.SendMessage(player, "~b~ " + "/team, /tc, /position"); + break; + + case AdminLevel.SUPPORTER: + player.TriggerEvent("showShelp"); + break; + + case AdminLevel.ADMIN: + player.TriggerEvent("showAhelp"); + break; + } + } + } + */ - case AdminLevel.SUPPORTER: - player.TriggerEvent("showShelp"); - break; - - case AdminLevel.ADMIN: - player.TriggerEvent("showAhelp"); - break; - } - } - } - */ #endregion ahelp #region Mapping / Entwicklung + [Command("team", "~m~Benutzung: ~s~/team")] public void CmdAdminTeam(Player player) { @@ -234,7 +244,7 @@ namespace ReallifeGamemode.Server.Commands switch (typ.ToLower()) { case "ip": - if(player.HasData("togip")) + if (player.HasData("togip")) { player.ResetData("togip"); player.SendNotification("~g~[Info]~w~ Ip´s werden nun ausgeblendet."); @@ -258,6 +268,7 @@ namespace ReallifeGamemode.Server.Commands player.SendNotification("~g~[Info]~w~ Deathlogs werden nun angezeigt."); } break; + case "lc": if (player.HasData("toglc")) { @@ -299,6 +310,7 @@ namespace ReallifeGamemode.Server.Commands } user.SetBlipAndNametagColor(); } + [Command("aduty", "~m~Benutzung: ~s~/aduty")] public void CmdAdminAduty(Player player) { @@ -314,11 +326,10 @@ namespace ReallifeGamemode.Server.Commands ChatService.Broadcast("~g~[SUPPORT] " + player.Name + " hat sich zum Support angemeldet"); player.TriggerEvent("toggleADutyMode", true); - } else { - if(player.GetData("SAdminduty")) + if (player.GetData("SAdminduty")) { CmdAdminTSupport(player); } @@ -338,7 +349,7 @@ namespace ReallifeGamemode.Server.Commands ChatService.NotAuthorized(player); return; } - + message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); message = Regex.Replace(message, "#([0-9A-Fa-f]{6})", m => "!{" + m.Groups[0].Value + "}"); @@ -467,8 +478,6 @@ namespace ReallifeGamemode.Server.Commands target.Kick(); ChatService.BroadcastAdmin("~y~SKICK: ~w~" + targetPlayername + " wurde von " + player.GetUser().AdminLevel.GetName() + " " + adminPlayername + " gekickt: " + reason, AdminLevel.SUPPORTER); - - } [Command("clearchat", "~m~Benutzung: ~s~/clearchat")] @@ -780,12 +789,10 @@ namespace ReallifeGamemode.Server.Commands string adminPlayername = NAPI.Player.GetPlayerName(player); ChatService.SendMessage(target, "~r~KICKINFO: ~w~Du wurdest von " + adminPlayername + " vom Server gekickt: " + reason); - + target.Kick(); ChatService.Broadcast("~y~INFO: ~w~" + targetPlayername + " wurde von " + player.GetUser().AdminLevel.GetName() + " " + adminPlayername + " gekickt: " + reason); - - } [Command("warn", "~m~Benutzung: ~s~/warn [Player] [Grund]", GreedyArg = true)] @@ -810,8 +817,8 @@ namespace ReallifeGamemode.Server.Commands using (var dbContext = new DatabaseContext()) { User userwarn = player.GetUser(dbContext); - - userwarn.warn ++; + + userwarn.warn++; dbContext.SaveChanges(); if (userwarn.warn >= 3) { @@ -949,6 +956,7 @@ namespace ReallifeGamemode.Server.Commands else player.Position = new Vector3(p.X, p.Y, p.Z); } } + [Command("destroyped", "~m~Benutzung: ~s~/destroyped [PedNr]")] public void CmdAdminAddPPed(Player player, int PedNr) { @@ -960,6 +968,7 @@ namespace ReallifeGamemode.Server.Commands player.TriggerEvent("CLIENT:DestroyPed", PedNr); //NAPI.Ped.CreatePed(PedHash.Bankman, new Vector3(player.Position.X, player.Position.Y, player.Position.Z), player.Heading, dimension); } + [Command("addpped", "~m~Benutzung: ~s~/addpped [PedNr] [model] [dimension] [Dynamic] [Freezed] [Collision(0-3)] [Weapon] [AttackProof] [Fire/Explosion-Proof] [DrownProof]")] public void CmdAdminAddPPed(Player player, Array PedNr, string model, uint dimension = 0, bool dynamic = false, bool freeze = false, int collision = 0, string weapon = "none", bool attackproof = false, bool fireexplosionproof = false, bool drownproof = false) { @@ -971,6 +980,7 @@ namespace ReallifeGamemode.Server.Commands player.TriggerEvent("CLIENT:AddPed", PedNr, model, player.Position.X, player.Position.Y, player.Position.Z, player.Heading, dimension, dynamic, freeze, collision, weapon, attackproof, fireexplosionproof, drownproof); //NAPI.Ped.CreatePed(PedHash.Bankman, new Vector3(player.Position.X, player.Position.Y, player.Position.Z), player.Heading, dimension); } + [Command("addmped", "~m~Benutzung: ~s~/addmped [model] [dimension]")] public void CmdAdminAddMPed(Player player, int model, uint dimension = 0) { @@ -982,6 +992,7 @@ namespace ReallifeGamemode.Server.Commands player.TriggerEvent("CLIENT:AddPedModel", model, player.Position.X, player.Position.Y, player.Position.Z, player.Heading, dimension); //NAPI.Ped.CreatePed(PedHash.Bankman, new Vector3(player.Position.X, player.Position.Y, player.Position.Z), player.Heading, dimension); } + [Command("addgped", "~m~Benutzung: ~s~/addgped")] public void CmdAdminAddGPed(Player player, int model, uint dimension = 0) { @@ -995,6 +1006,7 @@ namespace ReallifeGamemode.Server.Commands //Peter.freezePosition(true); } + [Command("addgpedmore", "~m~Benutzung: ~s~/addgpedMore")] public void CmdAdminAddGPedMore(Player player, int model, uint dimension = 0) { @@ -1193,7 +1205,7 @@ namespace ReallifeGamemode.Server.Commands [Command("respawnvehicle", "~m~Benutzung: ~s~/respawnvehicle (Db ID)", Alias = "rveh")] public void CmdAdminRespawnVehicle(Player player, int id = -1) { - if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) //change back to Admin { ChatService.NotAuthorized(player); return; @@ -1256,7 +1268,7 @@ namespace ReallifeGamemode.Server.Commands foreach (Vehicle v in vehiclesInRange) { ServerVehicle serverVehicle = VehicleManager.GetServerVehicleFromVehicle(v); - if(serverVehicle == null) + if (serverVehicle == null) { VehicleManager.DeleteVehicle(v); v.Trailer?.Delete(); @@ -1462,7 +1474,7 @@ namespace ReallifeGamemode.Server.Commands } ChatService.SendMessage(target, "!{#8181E9}Deine Akte wurde vom Admin " + player.Name + " gelöscht. Grund: " + reason); ChatService.BroadcastFaction("!{#8181E9}HQ: Die Akte von " + target.Name + " wurde vom Admin " + player.Name + " gelöscht. Grund: " + reason + ".", new List() { 1, 3 }); - + target.TriggerEvent("jailTime", 0); targetUser.Wanteds = 0; @@ -1687,6 +1699,7 @@ namespace ReallifeGamemode.Server.Commands #endregion Admin #region ALevel1337 + /*NUR ZUM TESTEN [Command("fakedeath", "~m~Benutzung:~s~ /fakedeath")] public void CmdAdmFakeDeath(Player player) @@ -1718,7 +1731,7 @@ namespace ReallifeGamemode.Server.Commands ChatService.NotAuthorized(player); return; } - player.SetSharedData("blipColor", blipId); + player.SetSharedData("blipColor", blipId); } [Command("setsvar", "~m~Benutzung:~s~ /setsvar [ID] [WERT]")] @@ -1996,7 +2009,7 @@ namespace ReallifeGamemode.Server.Commands { if (!managedPlayer.IsLoggedIn()) return; managedPlayer.GetUser(dbContext).Wage += wage; - + ChatService.SendMessage(managedPlayer, "~b~Admin " + player.Name + " hat im Radius von " + radius + " den Verdienst um $" + wage + " erhöht."); dbContext.SaveChanges(); } @@ -2130,12 +2143,14 @@ namespace ReallifeGamemode.Server.Commands player.SendChatMessage("Modifier steht auf" + modifier); player.TriggerEvent("SERVER:WeaponModifier2", player, modifier, 1); } + [Command("wepmmod", "~m~Benutzung: ~s~/wepmmod [Variable]")] public void CmdWeaponMeeleModifier(Player player, float modifier) { player.SendChatMessage("MeeleModifier steht auf" + modifier); player.TriggerEvent("SERVER:WeaponModifier2", player, 1, modifier); } + [Command("gotocp", "~m~Benutzung: ~s~/gotocp")] public void CmdAdminGotocp(Player admin) { @@ -2379,7 +2394,7 @@ namespace ReallifeGamemode.Server.Commands NAPI.Player.SpawnPlayer(managedPlayer, managedPlayer.Position); managedPlayer.Health = 100; - Medic.delReviveTask(managedPlayer); + Medic.delReviveTask(managedPlayer); } ChatService.SendMessage(player, "~b~Du hast " + playerRevided + " Spieler wiederbelebt."); @@ -2452,10 +2467,10 @@ namespace ReallifeGamemode.Server.Commands { ChatService.PlayerNotFound(player); return; - } + } - using (var dbContext = new DatabaseContext()) - { + using (var dbContext = new DatabaseContext()) + { Faction f = dbContext.Factions.FirstOrDefault(x => x.Id == faction); if (f == null) { @@ -2663,6 +2678,7 @@ namespace ReallifeGamemode.Server.Commands player.SetIntoVehicle(vehicle, 0); } break; + case "noobvehicle": if (player.IsInVehicle) { @@ -3056,6 +3072,7 @@ namespace ReallifeGamemode.Server.Commands player.TriggerEvent("manageFactionRanks", json); } } + [Command("setdoor", "~m~Benutzung: ~s~/setdoor [open/shut] [Tür] [Boolean:Permanet] [Boolean:Lose]")] public void CmdAdminSetDoorOpen(Player player, string status, int door, bool permanent = false, bool lose = true) { @@ -3080,6 +3097,7 @@ namespace ReallifeGamemode.Server.Commands } } } + [Command("aplaysound", "~m~Benutzung: ~s~/aplaysound [Dateiname] [mp3/wav] [volume 0.0 - 100.0]", Alias = "aps")] public void CmdAdminPlaySound(Player player, string sound, string typ, double volume = 100) { @@ -3090,6 +3108,7 @@ namespace ReallifeGamemode.Server.Commands } player.TriggerEvent("CLIENT:PlaySound", sound, typ, volume); } + [Command("astopsound", "~m~Benutzung: ~s~/astopsound", Alias = "ass")] public void CmdAdminStopSound(Player player) { @@ -3100,6 +3119,7 @@ namespace ReallifeGamemode.Server.Commands } player.TriggerEvent("CLIENT:StopSound"); } + [Command("aspeed", "~m~Benutzung: ~s~/aspeed [Modifier1] [Modifier2]")] //TODO: Überarbeiten ?? SetPlayerVelocity ?? public void CmdAdminAspeed(Player player, int modifier, int modifier2 = 1) { @@ -3521,13 +3541,13 @@ namespace ReallifeGamemode.Server.Commands public void CmdAdminCheckStats(Player player, string nameOrId) { User user = player.GetUser(); - if(!user.IsAdmin(AdminLevel.SUPPORTER)) + if (!user.IsAdmin(AdminLevel.SUPPORTER)) { ChatService.NotAuthorized(player); } Player target = PlayerService.GetPlayerByNameOrId(nameOrId); - if(target == null || !target.IsLoggedIn()) + if (target == null || !target.IsLoggedIn()) { ChatService.PlayerNotFound(player); return; @@ -3543,7 +3563,6 @@ namespace ReallifeGamemode.Server.Commands ChatService.SendMessage(player, $"Stats von {target.Name} - HandMoney: {handmoney.ToMoneyString()}, BankMoney: {bankmoney.ToMoneyString()}, DriverLicense: {driverLicense.ToString()}, BikeLicense: {bikeLicense.ToString()}, FlyingLicense: {flyingLicense.ToString()}, WeaponLicense: {weaponLicense.ToString()}"); } - #endregion ALevel1337 #region ALevel1338 @@ -3662,9 +3681,8 @@ namespace ReallifeGamemode.Server.Commands { return; } - if(player.HasData("Adminduty") && player.GetData("Adminduty")) - player.TriggerEvent("ADMIN:NoClip"); + if (player.HasData("Adminduty") && player.GetData("Adminduty")) + player.TriggerEvent("ADMIN:NoClip"); } - } } diff --git a/ReallifeGamemode.Server/Commands/FactionCommands.cs b/ReallifeGamemode.Server/Commands/FactionCommands.cs index faae6191..358cb273 100644 --- a/ReallifeGamemode.Server/Commands/FactionCommands.cs +++ b/ReallifeGamemode.Server/Commands/FactionCommands.cs @@ -11,6 +11,7 @@ using ReallifeGamemode.Server.Factions.Medic; using ReallifeGamemode.Server.Managers; using ReallifeGamemode.Server.Services; using ReallifeGamemode.Server.Types; +using ReallifeGamemode.Server.Util; using ReallifeGamemode.Services; /** @@ -57,7 +58,7 @@ namespace ReallifeGamemode.Server.Commands string rank = string.Empty; - if(f?.Name == "Ballas" || f?.Name == "Grove") + if (f?.Name == "Ballas" || f?.Name == "Grove") { rank = player.GetUser().GetFactionRank().RankName; } @@ -109,7 +110,7 @@ namespace ReallifeGamemode.Server.Commands string factionName = string.Empty; - if(f?.StateOwned ?? false) + if (f?.StateOwned ?? false) { factionName = u.GetFactionRank().RankName; } @@ -127,7 +128,6 @@ namespace ReallifeGamemode.Server.Commands #endregion Chat Commands - #region NewsReporter commands [Command("news", "~m~Benutzung: ~s~/news [Nachricht]", GreedyArg = true)] @@ -139,12 +139,12 @@ namespace ReallifeGamemode.Server.Commands ChatService.NotAuthorized(player); return; } - if (player.GetUser().Faction.Id == 9 ) + if (player.GetUser().Faction.Id == 9) { message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); string broadcastMessage = "!{ff9531}** News Reporter" + " " + player.Name + ": " + message + " **"; - ChatService.Broadcast(broadcastMessage); + ChatService.Broadcast(broadcastMessage); } else { @@ -152,11 +152,8 @@ namespace ReallifeGamemode.Server.Commands } } - - - - #endregion NewsReporter commands + #region Leader Commands [Command("giverank", "~m~Benutzung: ~s~/giverank [Name] [Rang]", GreedyArg = true)] @@ -212,7 +209,7 @@ namespace ReallifeGamemode.Server.Commands message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); string factionName = string.Empty; - if(user.FactionLeader) + if (user.FactionLeader) { factionName = player.GetUser().Faction.Name; } @@ -226,7 +223,7 @@ namespace ReallifeGamemode.Server.Commands NAPI.Pools.GetAllPlayers().ForEach(p => { User pUser = p.GetUser(); - if (pUser.FactionLeader || pUser.IsAdmin(AdminLevel.ADMIN)) + if ((pUser?.FactionLeader ?? false) || pUser.IsAdmin(AdminLevel.ADMIN)) { ChatService.SendMessage(p, broadcastMsg); } @@ -329,7 +326,7 @@ namespace ReallifeGamemode.Server.Commands deadPlayerUser.Handmoney = 0; deadPlayerUser.BankAccount.Balance -= bankMoney; } - + player.PlayAnimation("amb@medic@standing@kneel@enter", "enter", 0); deadPlayer.TriggerEvent("onPlayerRevived"); @@ -363,7 +360,7 @@ namespace ReallifeGamemode.Server.Commands return; } - if(player.Position.DistanceTo(target.Position) > 5) + if (player.Position.DistanceTo(target.Position) > 5) { ChatService.ErrorMessage(player, "Der Patient ist zu weit entfernt"); return; @@ -398,16 +395,40 @@ namespace ReallifeGamemode.Server.Commands return; } - ChatService.SendMessage(target,"~g~" + player.Name + " ~s~möchte dich für ~g~$" + price + " ~s~heilen. Drücke ~g~J~s~ zum Erlauben oder ~r~N ~s~zum Verbieten"); - player.SendNotification("Du hast " + target.Name + " einen Heal angeboten",false); + ChatService.SendMessage(target, "~g~" + player.Name + " ~s~möchte dich für ~g~$" + price + " ~s~heilen. Drücke ~g~J~s~ zum Erlauben oder ~r~N ~s~zum Verbieten"); + player.SendNotification("Du hast " + target.Name + " einen Heal angeboten", false); target.SetData("healDecision", true); - Medic.HealDecisions.Add(new Medic.HealDecision {dMedic = player, dTarget = target, dPrice = price}); + Medic.HealDecisions.Add(new Medic.HealDecision { dMedic = player, dTarget = target, dPrice = price }); } #endregion Sanitäter Commands #region Staatsfraktionen (LSPD / FBI) Commands + [Command("cuff", "~m~Benutzung: ~s~/cuff")] + public void CmdFactionCuff(Player player) + { + User user = player.GetUser(); + if (user == null || (user.FactionId != 1 && user.FactionId != 3)) + { + ChatService.NotAuthorized(player); + return; + } + + if (!player.IsDuty()) + { + ChatService.ErrorMessage(player, "Du bist nicht im Dienst"); + return; + } + + Player nearestCuffPlayer = PositionManager.cuffPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.6 && user.GetData("duty")); + + if (nearestCuffPlayer is null) + return; + + player.CuffPlayer(nearestCuffPlayer); + } + [Command("wanted", "~m~Benutzung: ~s~/wa(nted) [Spieler] [Anzahl] [Grund]", Alias = "wa", GreedyArg = true)] public void CmdFactionWanted(Player player, string nameOrId, int amount, string reason) { @@ -480,7 +501,7 @@ namespace ReallifeGamemode.Server.Commands } ChatService.SendMessage(target, "!{#8181E9}Deine Akte wurde von " + player.Name + " gelöscht. Grund: " + reason); ChatService.BroadcastFaction("!{#8181E9}HQ: Die Akte von " + target.Name + " wurde von " + player.Name + " gelöscht. Grund: " + reason + ".", new List() { 1, 3 }); - + target.TriggerEvent("jailTime", 0); targetUser.Wanteds = 0; @@ -491,11 +512,12 @@ namespace ReallifeGamemode.Server.Commands } #endregion Staatsfraktionen (LSPD / FBI) Commands + #region Weazel News + [Command("eventchat", "~m~Benutzung: ~s~/eventchat [Typ = ~g~on~s~, ~g~off~s~]", GreedyArg = true)] public void CmdFactionNREventchat(Player player, string onoff) { - switch (onoff.ToLower()) { case "on": @@ -513,14 +535,9 @@ namespace ReallifeGamemode.Server.Commands }); player.SendNotification("Der Eventchat ist nun aus."); break; - } - - } - #endregion Weazel News } - } diff --git a/ReallifeGamemode.Server/Commands/UserCommands.cs b/ReallifeGamemode.Server/Commands/UserCommands.cs index f61103e3..d4dde10e 100644 --- a/ReallifeGamemode.Server/Commands/UserCommands.cs +++ b/ReallifeGamemode.Server/Commands/UserCommands.cs @@ -16,14 +16,12 @@ namespace ReallifeGamemode.Server.Commands { internal class UserCommands : Script { - [Command("skill")] public void CmdUserSkill(Player player) { User user = player.GetUser(new DatabaseContext()); player.SendChatMessage($"~c~BusSkill = {user.BusSkill}/800, PilotSkill = {user.PilotSkill}/300."); - } [Command("id", "~m~Benutzung: ~s~/id [Name]")] @@ -34,7 +32,8 @@ namespace ReallifeGamemode.Server.Commands if (target == null) { player.SendChatMessage("~c~Spieler ist nicht online."); - } else + } + else { player.SendChatMessage("~c~ID: (" + target.Id + ") " + target.Name); } @@ -90,6 +89,7 @@ namespace ReallifeGamemode.Server.Commands ChatService.SendMessage(player, "~m~" + ((VehicleHash)pVeh.Model) + " | Farbe 1: " + pVeh.PrimaryColor + " | Farbe 2: " + pVeh.SecondaryColor + " | ID: " + pVeh.Handle.Value); } } + [Command("help", "~m~Benutzung: ~s~/help")] public void CmdHelp(Player player) { @@ -106,8 +106,7 @@ namespace ReallifeGamemode.Server.Commands [Command("hup")] public void CmdAnim(Player player) { - player.StopAnimation(); - player.PlayAnimation("mp_am_hold_up", "handsup_base", (int)(AnimationFlags.Loop | AnimationFlags.OnlyAnimateUpperBody | AnimationFlags.AllowPlayerControl | AnimationFlags.Cancellable)); + player.ToggleSurrender(); } [Command("event", "~m~Benutzung: ~s~/event [Nachricht]", GreedyArg = true)] @@ -118,9 +117,7 @@ namespace ReallifeGamemode.Server.Commands ChatService.NotAuthorized(player); return; } - ChatService.BroadcastFaction("~b~[Event] " + player.Name + ": " + msg, new List() { 9 }) ; - + ChatService.BroadcastFaction("~b~[Event] " + player.Name + ": " + msg, new List() { 9 }); } } } - diff --git a/ReallifeGamemode.Server/Events/Connect.cs b/ReallifeGamemode.Server/Events/Connect.cs index d468ddbf..becbb3b9 100644 --- a/ReallifeGamemode.Server/Events/Connect.cs +++ b/ReallifeGamemode.Server/Events/Connect.cs @@ -81,8 +81,8 @@ namespace ReallifeGamemode.Server.Events player.TriggerEvent("SERVER:Login_ShowBrowser", registered, disableLightMode); string msg = "~m~*** " + player.Name + " [" + player.SocialClubName + "] [ID: " + player.Handle.Value + "] (" + player.Address + ")"; - if(player.HasData("togip")) - { + if (player.HasData("togip")) + { ChatService.SendMessage(player, msg); } } diff --git a/ReallifeGamemode.Server/Events/Death.cs b/ReallifeGamemode.Server/Events/Death.cs index b4edee69..f6f0e0c6 100644 --- a/ReallifeGamemode.Server/Events/Death.cs +++ b/ReallifeGamemode.Server/Events/Death.cs @@ -25,71 +25,74 @@ namespace ReallifeGamemode.Server.Events public class Death : Script { [ServerEvent(Event.PlayerDeath)] - public void OnPlayerDeath(Player player, Player killer, uint reason ) + public void OnPlayerDeath(Player player, Player killer, uint reason) { if (!player.IsLoggedIn()) { player.Kick(); return; } - - player.SetData("isDead", true); + using var dbContext = new DatabaseContext(); - using (var userDeath = new DatabaseContext()) - { - User userisdead = player.GetUser(userDeath); - userisdead.Dead = true; - userDeath.SaveChanges(); - } + User user = player.GetUser(dbContext); + + PositionManager.cuffPoints.Remove(player); //TODO: Zum Full Release entfernen - if (player.HasData("togdeath")) { - ChatService.SendMessage(player, "Du bist durch " + (killer?.Name ?? "Niemanden") + " gestorben: " + reason.ToString()); - } - int? killerId; - float killerPosX; - float killerPosY; - float killerPosZ; - float killerHeading; - - if (killer == null || killer.IsNull) + if (player.HasData("togdeath")) { - killerId = null; - killerPosX = -1; - killerPosY = -1; - killerPosZ = -1; - killerHeading = -1; + ChatService.SendMessage(player, "Du bist durch " + (killer?.Name ?? "Niemanden") + " gestorben: " + reason.ToString()); + } + int? killerId = null; + float killerPosX = -1; + float killerPosY = -1; + float killerPosZ = -1; + float killerHeading = -1; + + if (killer.IsLoggedIn()) + { + var killerUser = killer.GetUser(dbContext); + if (killerUser != null) + { + killerId = killerUser.Id; + killerPosX = killer.Position.X; + killerPosY = killer.Position.Y; + killerPosZ = killer.Position.Z; + killerHeading = killer.Heading; + if (player.HasData("inGangWar") && killer.HasData("inGangWar")) + { + Gangwar.Gangwar.GangwarKill(killer, player); + } + + if (player != killer) + { + Autowanted.Check_AutoWanted(killer, player); + string message = "~y~[HINWEIS]: " + killer.Name + " hat " + player.Name + " getötet (" + Managers.WeaponManager.GetCauseOfDeathByHash(reason) + ")"; + ChatService.BroadcastAdmin(message, AdminLevel.ADMIN); + } + } + } + + bool copNearby = NAPI.Pools.GetAllPlayers().Any(u => u.IsDuty() && u.IsAlive() && u.Position.DistanceToSquared(player.Position) <= 200 * 200); + + if (copNearby) + { + user.SetJailTime(true); + Jail.Check_PutBehindBars(user); + ChatService.HQMessage(user.Name + " wurde ins Gefängnis eingeliefert."); } else { - var killerUser = killer.GetUser(); - if (killerUser == null) - { - return; - } - killerId = killerUser.Id; - killerPosX = killer.Position.X; - killerPosY = killer.Position.Y; - killerPosZ = killer.Position.Z; - killerHeading = killer.Heading; - if (player.HasData("inGangWar") && killer.HasData("inGangWar")) - { - Gangwar.Gangwar.GangwarKill(killer, player); - } - - if (player != killer) - { - Autowanted.Check_AutoWanted(killer, player); - string message = "~y~[HINWEIS]: " + killer.Name + " hat " + player.Name + " getötet (" + Managers.WeaponManager.GetCauseOfDeathByHash(reason) + ")"; - ChatService.BroadcastAdmin(message, AdminLevel.ADMIN); - } + ChatService.HQMessage(user.Name + " wurde soeben ins Krankenhaus eingeliefert."); } - User user = player.GetUser(); - if (user.JailTime <= 0) { + player.SetData("isDead", true); + + user.Dead = true; + if (!player.HasData("reviveSperre")) { //MEDIC AUFTRAG @@ -108,8 +111,6 @@ namespace ReallifeGamemode.Server.Events Medic.delHealTask(player); ChatService.BroadcastFaction("~y~[MEDIC] ~w~" + player.Name + " ist soeben verstorben.", new List() { 2 }); } - - if (player.GetUser().IsAdmin(AdminLevel.ADMIN) == true) { @@ -123,32 +124,28 @@ namespace ReallifeGamemode.Server.Events //TODO PICTURE NOTIFICATION + SOUND für Medics player.ClearAttachments(); - - using (var userDeath = new DatabaseContext()) + List fItem = dbContext.UserItems.Where(u => u.UserId == user.Id).ToList(); + foreach (var item in fItem) { - List fItem = userDeath.UserItems.Where(u => u.UserId == user.Id).ToList(); - foreach (var item in fItem) + IItem iItem = InventoryManager.GetItemById(item.ItemId); + if (iItem is IWeaponDealItem obj) { - IItem iItem = InventoryManager.GetItemById(item.ItemId); - if (iItem is IWeaponDealItem obj) - { - int amount = item.Amount; + int amount = item.Amount; - Vector3 dropPosition = PlayerExtension.GetPositionFromPlayer(player, 0.6f, 0); - //new Vector3(player.Position.X, player.Position.Y, player.Position.Z - 0.8f); - Random r = new Random(); - GTANetworkAPI.Object grndObject; - Vector3 textPos = dropPosition; + Vector3 dropPosition = PlayerExtension.GetPositionFromPlayer(player, 0.6f, 0); + //new Vector3(player.Position.X, player.Position.Y, player.Position.Z - 0.8f); + Random r = new Random(); + GTANetworkAPI.Object grndObject; + Vector3 textPos = dropPosition; - dropPosition.Z -= 1.05f; - grndObject = NAPI.Object.CreateObject(3666746839, dropPosition, new Vector3(0, 0, r.Next(0, 360)), 255, 0); + dropPosition.Z -= 1.05f; + grndObject = NAPI.Object.CreateObject(3666746839, dropPosition, new Vector3(0, 0, r.Next(0, 360)), 255, 0); - GroundItem grndItem = new GroundItem { ItemId = iItem.Id, Amount = amount, Position = dropPosition }; - TextLabel grndTxtLbl = NAPI.TextLabel.CreateTextLabel(iItem.Name + " ~s~(~y~" + amount + "~s~)", textPos, 5, 0.5f, 4, new Color(255, 255, 255), false, 0); - GroundItem.AddGroundItem(grndItem, grndObject, grndTxtLbl); + GroundItem grndItem = new GroundItem { ItemId = iItem.Id, Amount = amount, Position = dropPosition }; + TextLabel grndTxtLbl = NAPI.TextLabel.CreateTextLabel(iItem.Name + " ~s~(~y~" + amount + "~s~)", textPos, 5, 0.5f, 4, new Color(255, 255, 255), false, 0); + GroundItem.AddGroundItem(grndItem, grndObject, grndTxtLbl); - userDeath.Remove(item); - } + dbContext.Remove(item); } var dead = new Database.Entities.Logs.Death @@ -165,8 +162,7 @@ namespace ReallifeGamemode.Server.Events VictimHeading = player.Heading, CauseOfDeath = reason.ToString() }; - userDeath.DeathLogs.Add(dead); - userDeath.SaveChanges(); + dbContext.DeathLogs.Add(dead); } } Job.JobBase job = Managers.JobManager.GetJob(player.GetUser().JobId ?? -1); @@ -219,9 +215,7 @@ namespace ReallifeGamemode.Server.Events //ChatService.SendMessage(player, "Debug10"); } } - - //JailTime.cs - Jail.Check_PutBehindBars(player); + dbContext.SaveChanges(); } [RemoteEvent("RespawnPlayerAtHospital")] diff --git a/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs b/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs index 46e58036..b63b7661 100644 --- a/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs +++ b/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs @@ -15,17 +15,15 @@ namespace ReallifeGamemode.Server.Events public class EnterVehicleAttempt : Script { public static GTANetworkAPI.Vehicle Roller; + [ServerEvent(Event.PlayerEnterVehicleAttempt)] public void OnPlayerEnterVehicleAttempt(Player player, GTANetworkAPI.Vehicle vehicle, sbyte seat) { - if ((VehicleHash)vehicle.Model == VehicleHash.Dune3) - { - if (seat == 1) seat = 0; - else if (seat == 0) seat = 1; - } - if (seat != 0) return; + if (player.HasAnimation()) + player.StopAnimation(); + User u = player.GetUser(); if (vehicle.GetServerVehicle() is FactionVehicle veh) @@ -84,7 +82,6 @@ namespace ReallifeGamemode.Server.Events return; } } - } if (vehicle.GetServerVehicle() is SchoolVehicle sVeh) { diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index b03b7da6..70012ea6 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -21,7 +21,7 @@ using ReallifeGamemode.Server.WeaponDeal; /** * @overview Life of German Reallife - Event Key (Key.cs) -* @author VegaZ +* @author VegaZ, balbo * @copyright (c) 2008 - 2018 Life of German */ @@ -30,6 +30,7 @@ namespace ReallifeGamemode.Server.Events public class Key : Script { #region User Key + [RemoteEvent("keyPress:NUM2")] public void KeyPressNUM2(Player player) { @@ -60,6 +61,7 @@ namespace ReallifeGamemode.Server.Events GroundItem.PickUpGroundItem(player); } + /* [RemoteEvent("keyPress:LEFT_ARROW")] public void KeyPressLeftArrow(Player player) @@ -85,6 +87,7 @@ namespace ReallifeGamemode.Server.Events } } */ + [RemoteEvent("keyPress:RIGHT_ARROW")] public void KeyPressRightArrow(Player player) { @@ -116,6 +119,7 @@ namespace ReallifeGamemode.Server.Events 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 { @@ -148,7 +152,6 @@ namespace ReallifeGamemode.Server.Events factionRank = u.GetFactionRank().RankName, group = u.Group?.Name ?? "Keine", groupRank = u.GroupRank.GetName(), - job = JobManager.GetJob(u.JobId ?? 0)?.Name ?? "Keiner", paycheck, licenses, vehicles, @@ -158,6 +161,14 @@ namespace ReallifeGamemode.Server.Events userWarn = u.warn, }; + var jobData = new + { + job = JobManager.GetJob(u.JobId ?? 0)?.Name ?? "Keiner", + busskill = u.BusSkill, + pilotskill = u.PilotSkill, + wage = u.Wage, + }; + string faction = u.Faction?.Name ?? "Zivilist"; string factionleader = u.FactionLeader ? u.Faction.Name : null; string group = u.Group != null ? u.Group.Name : null; @@ -168,7 +179,7 @@ namespace ReallifeGamemode.Server.Events int pay_amount = 0; bool house = false; - if(u.House != null) + if (u.House != null) { house = true; } @@ -183,8 +194,7 @@ namespace ReallifeGamemode.Server.Events pay_amount = player.GetData("pay_amount"); } - player.TriggerEvent("SERVER:InteractionMenu_OpenMenu", JsonConvert.SerializeObject(accountData), factionleader, faction, group, factionInvite, groupInvite, ticket_boolean, ticket_amount, pay_amount, house); - + player.TriggerEvent("SERVER:InteractionMenu_OpenMenu", JsonConvert.SerializeObject(accountData), factionleader, JsonConvert.SerializeObject(jobData), faction, group, factionInvite, groupInvite, ticket_boolean, ticket_amount, pay_amount, house); } [RemoteEvent("keyPress:E")] @@ -193,16 +203,15 @@ namespace ReallifeGamemode.Server.Events if (!player.IsLoggedIn()) return; var user = player.GetUser(); - if (player.HasData("nearATM")) { ATMManager.ShowAtmUi(player, player.GetData("nearATM")); return; } - if(!player.IsInVehicle) + if (!player.IsInVehicle) { - if(GroundItem.PickUpGroundItem(player)) + if (GroundItem.PickUpGroundItem(player)) { return; } @@ -216,7 +225,8 @@ namespace ReallifeGamemode.Server.Events FriseurPoint nearestFriseurPoint = PositionManager.friseurPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.5 && (!user.GetData("duty"))); ItemshopPoint nearestItemShopPoint = PositionManager.itemshopPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.5); JobPoint nearestJobPoint = PositionManager.JobPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.6); - + Player nearestCuffPlayer = PositionManager.cuffPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.6 && user.GetData("duty")); + if (user?.FactionId != null) { BehindVehiclePoint nearestBehindVehiclePoint = MarkerBehinVehicle.behindVehiclePoints.Find(s => s.marker.Position.DistanceTo(player.Position) <= 3 && (user.FactionId == 8 || user.FactionId == 7 || user.FactionId == 1 || user.FactionId == 3)); @@ -228,7 +238,6 @@ namespace ReallifeGamemode.Server.Events List vehicleItems = dbContext.VehicleItems.ToList().Where(f => f.GetVehicle().GetVehicle() == nearestBehindVehiclePoint.vehicle && InventoryManager.GetItemById(f.ItemId) is IWeaponDealItem).ToList(); if (vehicleItems.Count == 0) { - GTANetworkAPI.Vehicle vehicle = nearestBehindVehiclePoint.vehicle; if (vehicle.HasAttachment("weapondeal")) @@ -366,7 +375,7 @@ namespace ReallifeGamemode.Server.Events if (player.HasAttachment("ammobox")) { player.AddAttachment("ammobox", true); - player.StopAnimation(); + player.ClearAnimation(); } bool unloadedWeaponPackage = false; @@ -429,13 +438,12 @@ namespace ReallifeGamemode.Server.Events if (user.FactionRank.Order >= weapon.Rank) specials.Add(weapon.WeaponModel.ToString()); break; + case 5: if (user.FactionRank.Order >= weapon.Rank) armor.Add(weapon.WeaponModel.ToString()); break; - } - } foreach (var weapon in weapons) { @@ -495,7 +503,7 @@ namespace ReallifeGamemode.Server.Events foreach (Player target in NAPI.Pools.GetAllPlayers()) { User c = target.GetUser(); - if(c == null) + if (c == null) { continue; } @@ -507,6 +515,10 @@ namespace ReallifeGamemode.Server.Events } player.TriggerEvent("showJailMenu", JsonConvert.SerializeObject(criminals.ToArray())); } + if (nearestCuffPlayer != null) + { + player.CuffPlayer(nearestCuffPlayer); + } } if (nearestElevatorPoint != null) { @@ -555,7 +567,7 @@ namespace ReallifeGamemode.Server.Events player.TriggerEvent("renderTextOnScreen", "Steige nun in eines der Fahrzeuge und starte den Motor mit der Taste 'N'."); return; } - } + } else if (nearestJobPoint.jobId == 3 && player.GetUser().JobId == 3) { if (nearestJobPoint.Skill < 300 && player.GetUser().PilotSkill >= 0) @@ -607,6 +619,8 @@ namespace ReallifeGamemode.Server.Events public void KeyPressI(Player player) { if (!player.IsLoggedIn()) return; + if (player.GetData("isDead")) return; + player.TriggerEvent("inventoryShow"); InventoryManager.SetBackpackItems(player); } @@ -676,21 +690,21 @@ namespace ReallifeGamemode.Server.Events player.TriggerEvent("SERVER:Job_ShowJobMenu", job.Name, json); } - [RemoteEvent("keyPress:O")] public void KeyPressO(Player player) { if (!player.IsLoggedIn()) return; + List players = NAPI.Pools.GetAllPlayers().Where(p => p.IsLoggedIn() == true).OrderBy(o => o.Handle.Value).ToList(); var listPlayers = players.Select(p => new - { - Id = p.Handle.Value, - p.Name, - p.Ping, - FactionName = p.GetUser()?.Faction?.Name ?? "Zivilist", - }); - player.TriggerEvent("showPlayerlist", JsonConvert.SerializeObject(listPlayers)); + { + Id = p.Handle.Value, + p.Name, + p.Ping, + FactionName = p.GetUser()?.Faction?.Name ?? "Zivilist", + }); + player.TriggerEvent("showPlayerlist", JsonConvert.SerializeObject(listPlayers)); } [RemoteEvent("keyPress:K")] @@ -797,9 +811,9 @@ namespace ReallifeGamemode.Server.Events } else if (sV is FactionVehicle fV) { - if(fV.Model == VehicleHash.Burrito3 && u.FactionId == 1 - || fV.Model == VehicleHash.Burrito3 && u.FactionId == 3 - || fV.Model == VehicleHash.Burrito3 && u.FactionId == 7 + if (fV.Model == VehicleHash.Burrito3 && u.FactionId == 1 + || fV.Model == VehicleHash.Burrito3 && u.FactionId == 3 + || fV.Model == VehicleHash.Burrito3 && u.FactionId == 7 || fV.Model == VehicleHash.Burrito3 && u.FactionId == 8 || fV.Model == VehicleHash.Policet && u.FactionId == 1 || fV.Model == VehicleHash.Policet && u.FactionId == 3 @@ -963,8 +977,13 @@ namespace ReallifeGamemode.Server.Events player.TriggerEvent("ToggleVehicleMenu"); } } - #endregion - #region Faction Key - #endregion + + [RemoteEvent("keyPress:ControllH")] + public void KeyPressControllH(Player player) + { + player.ToggleSurrender(); + } + + #endregion User Key } } diff --git a/ReallifeGamemode.Server/Events/Login.cs b/ReallifeGamemode.Server/Events/Login.cs index ccdd6628..1da5ec9f 100644 --- a/ReallifeGamemode.Server/Events/Login.cs +++ b/ReallifeGamemode.Server/Events/Login.cs @@ -54,6 +54,7 @@ namespace ReallifeGamemode.Server.Events } else { + player.SetData("dbId", user.Id); player.Name = username; player.TriggerEvent("SERVER:Login_Success"); player.TriggerEvent("CLIENT:StopSound"); @@ -122,7 +123,7 @@ namespace ReallifeGamemode.Server.Events } else { - Jail.Check_PutBehindBars(player); + Jail.Check_PutBehindBars(user); } } diff --git a/ReallifeGamemode.Server/Events/PlayerEvent.cs b/ReallifeGamemode.Server/Events/PlayerEvent.cs new file mode 100644 index 00000000..abd12a3c --- /dev/null +++ b/ReallifeGamemode.Server/Events/PlayerEvent.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; +using GTANetworkAPI; + +namespace ReallifeGamemode.Server.Events +{ + internal class PlayerEvent : Script + { + [RemoteEvent("CLIENT:SET_InFrontOfPos")] + public void SetFrontOfPos(Player player, Vector3 pos) + { + player.Position = pos; + } + } +} diff --git a/ReallifeGamemode.Server/Events/Register.cs b/ReallifeGamemode.Server/Events/Register.cs index 3a18f8a7..8536642b 100644 --- a/ReallifeGamemode.Server/Events/Register.cs +++ b/ReallifeGamemode.Server/Events/Register.cs @@ -6,7 +6,7 @@ using ReallifeGamemode.Database.Models; /** * @overview Life of German Reallife - Event Register (Register.cs) -* @author VegaZ +* @author VegaZ, balbo * @copyright (c) 2008 - 2018 Life of German */ @@ -20,11 +20,18 @@ namespace ReallifeGamemode.Server.Events string username = player.Name; using (var dbContext = new DatabaseContext()) { + if (password.Length < 6) + { + player.TriggerEvent("SERVER:Login_Error", "Das Passwort muss aus mindestens 6 Zeichen bestehen."); + return; + } if (dbContext.Users.Where(u => u.SocialClubName == player.SocialClubName).Count() >= 3) { player.TriggerEvent("SERVER:Login_Error", "Es sind schon 3 Konten mit dieser Socialclub-ID registriert."); + return; } - else if (!dbContext.Users.Any(u => u.Name.ToLower() == username.ToLower().Trim())) + + if (!dbContext.Users.Any(u => u.Name.ToLower() == username.ToLower().Trim())) { var user = new User { @@ -44,6 +51,7 @@ namespace ReallifeGamemode.Server.Events dbContext.Users.Add(user); dbContext.SaveChanges(); + player.SetData("dbId", user.Id); player.TriggerEvent("SERVER:Login_Success"); player.TriggerEvent("CLIENT:StopSound"); player.SetData("isLoggedIn", true); diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index ebdee723..e20a998e 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -6,8 +6,10 @@ using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Database.Models; +using ReallifeGamemode.Server.Managers; using ReallifeGamemode.Server.Services; using ReallifeGamemode.Server.Types; +using ReallifeGamemode.Server.Util; /** * @overview Life of German Reallife - Player Extension (PlayerExtension.cs) @@ -57,6 +59,34 @@ namespace ReallifeGamemode.Server.Extensions } } + public static void SetJailTime(this User user, bool killed) + { + if (user == null) + { + return; + } + + int time = 26 * user.Wanteds; + if (killed) + { + time *= 2; + } + + user.Wanteds = 0; + user.JailTime = time; + } + + public static void AnnouncePlayerJailedIn(this User user) + { + if (user == null) + { + return; + } + string message = user.Name + " wurde ins Gefängnis geliefert"; + + ChatService.HQMessage(message); + } + /// /// Gibt zurück, ob ein Player eingeloggt ist /// @@ -74,13 +104,42 @@ namespace ReallifeGamemode.Server.Extensions public static bool IsDuty(this Player player) { - var user = player.GetUser(); - return user.GetData("duty", false); + return player.GetServerData("duty", false); } + + public static bool IsAlive(this Player player) + { + return !player.HasData("isDead") || player.GetData("isDead") == false; + } + + public static T GetServerData(this Player player, string key, T defaultValue = default) + { + if (player == null) + { + return default; + } + + key += "data_"; + if (!player.HasData(key)) return defaultValue; + return JsonConvert.DeserializeObject(player.GetData(key)); + } + + public static void SetServerData(this Player player, string key, object value) + { + if (player == null) + { + return; + } + + key += "data_"; + player.SetData(key, JsonConvert.SerializeObject(value)); + } + public static bool IsAdminDuty(this Player player) { return player.HasData("Adminduty") ? player.GetData("Adminduty") : false; } + public static Vector3 GetPositionFromPlayer(Player player, float distance, int offset = 0) { var pos = player.Position; @@ -94,27 +153,14 @@ namespace ReallifeGamemode.Server.Extensions internal static T GetData(this User user, string key, T nullValue) { - if (user == null) - { - return default; - } - - key += "data_"; - if (!user.Player.HasData(key)) return nullValue; - return JsonConvert.DeserializeObject(user.Player.GetData(key)); + return user.Player.GetServerData(key, nullValue); } internal static T GetData(this User user, string key) => user.GetData(key, default); internal static void SetData(this User user, string key, object value) { - if (user == null) - { - return; - } - - key += "data_"; - user.Player.SetData(key, JsonConvert.SerializeObject(value)); + user.Player.SetServerData(key, value); } internal static void GiveWanteds(this User user, Player cop, int amount, string reason) @@ -268,11 +314,11 @@ namespace ReallifeGamemode.Server.Extensions } else if (user.FactionId != null) { - if(user.FactionId > 3 || (user.FactionId >= 1 && user.FactionId <= 3 && duty)) + if (user.FactionId > 3 || (user.FactionId >= 1 && user.FactionId <= 3 && duty)) { nameTagColor = user.FactionId.Value; } - + switch (user.FactionId) { case 1 when duty: @@ -314,5 +360,48 @@ namespace ReallifeGamemode.Server.Extensions user.Player.SetSharedData("nameTagColor", nameTagColor); user.Player.SetSharedData("blipColor", blipColor); } + + public static void SetInFrontOf(this Player player, Entity entity) + { + player.TriggerEvent("SERVER:SetInFrontPosition", entity); + } + + public static void CuffPlayer(this Player player, Player nearestCuffPlayer) + { + nearestCuffPlayer.SetInFrontOf(player); + nearestCuffPlayer.Heading = player.Heading; + + if (!nearestCuffPlayer.HasAnimation("Cuffed")) + { + player.SyncAnimation("doArrest"); + nearestCuffPlayer.SyncAnimation(new List() { "getArrest", "Cuffed" }); + nearestCuffPlayer.AddAttachment("handcuffs", false); + nearestCuffPlayer.RemoveAllWeapons(); + } + else + { + nearestCuffPlayer.AddAttachment("handcuffs", true); + player.SyncAnimation("doUncuff"); + nearestCuffPlayer.SyncAnimation("getUncuff"); + PositionManager.cuffPoints.Remove(nearestCuffPlayer); + } + } + + public static void ToggleSurrender(this Player player) + { + if (player.HasAnimation("hup")) + { + PositionManager.cuffPoints.Remove(player); + player.ClearAnimation(); + return; + } + if (player.HasAnimation()) + return; + + player.SyncAnimation("hup"); + + if (player.GetUser().Wanteds > 0) + PositionManager.cuffPoints.Add(player); + } } } diff --git a/ReallifeGamemode.Server/Factions/Medic/Medic.cs b/ReallifeGamemode.Server/Factions/Medic/Medic.cs index f4050385..41447614 100644 --- a/ReallifeGamemode.Server/Factions/Medic/Medic.cs +++ b/ReallifeGamemode.Server/Factions/Medic/Medic.cs @@ -192,27 +192,27 @@ namespace ReallifeGamemode.Server.Factions.Medic } [RemoteEvent("updateMedicTask")] - public void UpdateMedicTasks(Player player, int type, int index) + public void UpdateMedicTasks(Player player, int type, string victim) { - Player target = PlayerService.GetPlayerByNameOrId(ReviveTasks[index].Victim); + Player target = PlayerService.GetPlayerByNameOrId(victim); switch (type) { case 0: - - ReviveTasks[index].MedicName = player.Name; - ChatService.BroadcastFaction("~y~[MEDIC] ~w~" + player.Name + " hat den Reviveauftrag von " + ReviveTasks[index].Victim + " angenommen.", new List() { 2 }); + var reviveTask = ReviveTasks.FirstOrDefault(t => t.Victim == victim); + reviveTask.MedicName = player.Name; + ChatService.BroadcastFaction("~y~[MEDIC] ~w~" + player.Name + " hat den Reviveauftrag von " + victim + " angenommen.", new List() { 2 }); target.SendNotification("~w~Sanitäter~g~ " + player.Name + "~w~ eilt zur Rettung."); - break; case 1: - HealTasks[index].MedicName = player.Name; - ChatService.BroadcastFaction("~y~[MEDIC] ~w~" + player.Name + " hat den Healauftrag von " + ReviveTasks[index].Victim + " angenommen.", new List() { 2 }); + var healTask = ReviveTasks.FirstOrDefault(t => t.Victim == victim); + healTask.MedicName = player.Name; + ChatService.BroadcastFaction("~y~[MEDIC] ~w~" + player.Name + " hat den Healauftrag von " + victim + " angenommen.", new List() { 2 }); target.SendNotification("~w~Sanitäter~g~ " + player.Name + "~w~ hat deinen Auftrag angenommen."); break; case 2: - FireTasks[index].MedicName = player.Name; + //FireTasks[index].MedicName = player.Name; break; } } @@ -258,8 +258,8 @@ namespace ReallifeGamemode.Server.Factions.Medic { using var dbContext = new DatabaseContext(); { - dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 2).First().BankAccount.Balance += Medic.ReviveIncome / 2; - player.SendNotification($"Du hast den Einsatzort erreicht und ~g~{Medic.ReviveIncome / 2}$ ~s~für die Fraktion verdient."); + dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 2).First().BankAccount.Balance += Medic.ReviveIncome / 4; + player.SendNotification($"Du hast den Einsatzort erreicht und ~g~{Medic.ReviveIncome / 4}$ ~s~für die Fraktion verdient."); Medic.delReviveTaskMedic(player); dbContext.SaveChanges(); } diff --git a/ReallifeGamemode.Server/Finance/Economy.cs b/ReallifeGamemode.Server/Finance/Economy.cs index 4c551892..1ff424a2 100644 --- a/ReallifeGamemode.Server/Finance/Economy.cs +++ b/ReallifeGamemode.Server/Finance/Economy.cs @@ -171,7 +171,7 @@ namespace ReallifeGamemode.Server.Finance if (putInJail != 0 && minusJail) { - Jail.Check_PutBehindBars(client, false); + Jail.Check_PutBehindBars(u); } } diff --git a/ReallifeGamemode.Server/Gangwar/Turf.cs b/ReallifeGamemode.Server/Gangwar/Turf.cs index 3000d1ec..b7b46990 100644 --- a/ReallifeGamemode.Server/Gangwar/Turf.cs +++ b/ReallifeGamemode.Server/Gangwar/Turf.cs @@ -114,16 +114,13 @@ namespace ReallifeGamemode.Server.Gangwar this.timerCount = 0; } - private void reloadGangTurfs() + private void ReloadGangTurfs() { - var t = Task.Factory.StartNew(() => + NAPI.Task.Run(() => { - Task.Delay(10000).Wait(); Gangwar.loadTurfs(); Gangwar.loadTurfs_ToAllPlayers(); - }); - t.Wait(); - + }, delayTime: 2000); } private void Tick(object sender, System.Timers.ElapsedEventArgs e) @@ -303,7 +300,7 @@ namespace ReallifeGamemode.Server.Gangwar NAPI.ClientEvent.TriggerClientEventForAll("CLIENT:Turf_Conquered", JsonConvert.SerializeObject(this.TurfID), JsonConvert.SerializeObject(this.status), JsonConvert.SerializeObject(this.Owner)); Gangwar.loadTurfs(); Gangwar.loadTurfs_ToAllPlayers(); - reloadGangTurfs(); + ReloadGangTurfs(); } public void attack(string attacker) diff --git a/ReallifeGamemode.Server/Inventory/GroundItem.cs b/ReallifeGamemode.Server/Inventory/GroundItem.cs index 4c6ca743..0f059a5f 100644 --- a/ReallifeGamemode.Server/Inventory/GroundItem.cs +++ b/ReallifeGamemode.Server/Inventory/GroundItem.cs @@ -6,6 +6,7 @@ using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Extensions; using ReallifeGamemode.Server.Inventory.Interfaces; using ReallifeGamemode.Server.Managers; +using ReallifeGamemode.Server.Util; namespace ReallifeGamemode.Server.Inventory { @@ -99,9 +100,9 @@ namespace ReallifeGamemode.Server.Inventory } if (nearestItem is IWeaponDealItem obj) { - if (!player.HasAttachment("ammobox")) + if (!player.HasAttachment("ammobox") && !player.HasAnimation()) { - player.PlayAnimation("anim@heists@box_carry@", "idle", 49); + player.SyncAnimation("carryBox"); player.AddAttachment("ammobox", false); NAPI.Player.SetPlayerCurrentWeapon(player, WeaponHash.Unarmed); } diff --git a/ReallifeGamemode.Server/Managers/BusinessManager.cs b/ReallifeGamemode.Server/Managers/BusinessManager.cs index 7603df43..875d3c9a 100644 --- a/ReallifeGamemode.Server/Managers/BusinessManager.cs +++ b/ReallifeGamemode.Server/Managers/BusinessManager.cs @@ -129,6 +129,11 @@ namespace ReallifeGamemode.Server.Managers [ServerEvent(Event.PlayerEnterVehicle)] public void CarDealerBusiness_PlayerEnterVehicle(Player player, Vehicle veh, int seat) { + if(player.IsAdminDuty()) + { + return; + } + ServerVehicle sVeh = veh.GetServerVehicle(); if (sVeh == null) return; if (!(sVeh is ShopVehicle)) return; diff --git a/ReallifeGamemode.Server/Managers/InteractionManager.cs b/ReallifeGamemode.Server/Managers/InteractionManager.cs index 5d6875fc..b1c04dfc 100644 --- a/ReallifeGamemode.Server/Managers/InteractionManager.cs +++ b/ReallifeGamemode.Server/Managers/InteractionManager.cs @@ -19,7 +19,7 @@ using ReallifeGamemode.Server.Factions.Medic; /** * @overview Life of German Reallife - Managers Interaction (InteractionManager.cs) -* @author VegaZ +* @author VegaZ, balbo * @copyright (c) 2008 - 2018 Life of German */ @@ -772,13 +772,13 @@ namespace ReallifeGamemode.Server.Managers if (!player.IsLoggedIn()) return; List players = NAPI.Pools.GetAllPlayers(); - var listPlayers = players.Where(p => p.GetUser().Wanteds > 0) - .Select(p => new - { - Id = p.Handle.Value, - p.Name, - wanted = p.GetUser().Wanteds, - }); + var listPlayers = players + .Select(p => new + { + Id = p.Handle.Value, + p.Name, + wanted = p.GetUser()?.Wanteds, + }).Where(u => u.wanted > 0).ToList(); if (listPlayers.Count() > 0) player.TriggerEvent("showWantedlist", JsonConvert.SerializeObject(listPlayers)); @@ -809,6 +809,12 @@ namespace ReallifeGamemode.Server.Managers [RemoteEvent("CLIENT:InteractionMenu_CallService_Sani")] public void CallServiceSani(Player player) { + if (player.GetUser().FactionId == 2 && player.IsDuty()) + { + player.SendNotification("~r~[Fehler] ~w~Du kannst keinen Sanitäter rufen."); + return; + } + //MEDIC AUFTRAG MedicTask healTask = new MedicTask() { diff --git a/ReallifeGamemode.Server/Managers/InventoryManager.cs b/ReallifeGamemode.Server/Managers/InventoryManager.cs index c8befc54..36525511 100644 --- a/ReallifeGamemode.Server/Managers/InventoryManager.cs +++ b/ReallifeGamemode.Server/Managers/InventoryManager.cs @@ -18,7 +18,7 @@ using ReallifeGamemode.Server.Types; /** * @overview Life of German Reallife - Managers InventoryManager (InventoryManager.cs) -* @author hydrant, VegaZ +* @author hydrant, VegaZ, balbo * @copyright (c) 2008 - 2018 Life of German */ @@ -74,7 +74,7 @@ namespace ReallifeGamemode.Server.Managers { if (player.IsInVehicle) { - player.TriggerEvent("Error", "Du kannst dein Kofferraum nicht betätigen."); + player.TriggerEvent("Error", "Du kannst deinen Kofferraum gerade nicht öffnen."); } Vehicle veh = NAPI.Pools.GetAllVehicles().ToList().Where(v => v.Position.DistanceTo(player.Position) <= 2).FirstOrDefault(); if (veh == null) diff --git a/ReallifeGamemode.Server/Managers/PositionManager.cs b/ReallifeGamemode.Server/Managers/PositionManager.cs index ab097f63..5534a189 100644 --- a/ReallifeGamemode.Server/Managers/PositionManager.cs +++ b/ReallifeGamemode.Server/Managers/PositionManager.cs @@ -4,6 +4,7 @@ using GTANetworkAPI; using ReallifeGamemode.Server.Shop.Clothing; using ReallifeGamemode.Server.Shop.SevenEleven; using ReallifeGamemode.Server.Shop.Friseur; +using ReallifeGamemode.Server.Util; namespace ReallifeGamemode.Server.Managers { @@ -18,13 +19,15 @@ namespace ReallifeGamemode.Server.Managers public static List ElevatorPoints = new List(); public static List clotheshopPoints = new List(); - - public static List friseurPoints = new List(); + + public static List friseurPoints = new List(); public static List itemshopPoints = new List(); public static List JobPoints = new List(); + public static List cuffPoints = new List(); + public static void LoadPositionManager() { #region DutyPoints @@ -213,6 +216,7 @@ namespace ReallifeGamemode.Server.Managers NAPI.Blip.CreateBlip(513, p.Position, 1f, 16, "Busfahrer", 255, 0, true); } } + #endregion JobPoints #region Shops @@ -285,7 +289,6 @@ namespace ReallifeGamemode.Server.Managers return; } - player.Position = ElevatorPoints.Where(e => e.Stage == level).First().Position; } } @@ -347,7 +350,7 @@ public class BehindVehiclePoint { if (!player.HasAttachment("ammobox")) { - player.PlayAnimation("anim@heists@box_carry@", "idle", 49); + player.SyncAnimation("carryBox"); player.AddAttachment("ammobox", false); NAPI.Player.SetPlayerCurrentWeapon(player, WeaponHash.Unarmed); } @@ -389,7 +392,6 @@ public class JobPoint public Vector3 Position { get; set; } public int jobId { get; set; } public int Skill { get; set; } - } public class ElevatorPoint diff --git a/ReallifeGamemode.Server/Services/ChatService.cs b/ReallifeGamemode.Server/Services/ChatService.cs index 692c4263..255b30ad 100644 --- a/ReallifeGamemode.Server/Services/ChatService.cs +++ b/ReallifeGamemode.Server/Services/ChatService.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using GTANetworkAPI; using ReallifeGamemode.Database.Entities; @@ -115,6 +116,17 @@ namespace ReallifeGamemode.Server.Services }); } + internal static void SendInRange(Vector3 position, int range, string message) + { + foreach(Player player in NAPI.Pools.GetAllPlayers()) + { + if(player.Position.DistanceTo(position) <= range) + { + SendMessage(player, message); + } + } + } + public static void BroadcastGroup(string message, Group group) { message = $"!{{FF8080}}** Gruppe: {message}"; diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs new file mode 100644 index 00000000..274871b9 --- /dev/null +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using GTANetworkAPI; +using Newtonsoft.Json; +using ReallifeGamemode.Server.Managers; + +namespace ReallifeGamemode.Server.Util +{ + public static class AnimationSync + { + public static Dictionary> animationPair = new Dictionary>(); + + public static void SyncAnimation(this Player player, dynamic animationName) + { + if (player.IsInVehicle) + return; + + if (!player.HasData("Animation")) + player.SetData("Animation", String.Empty); + + string currentAnimation = player.GetData("Animation"); + string newAnimation = animationName; + + if (currentAnimation.Equals(newAnimation)) + return; + + player.SetSharedData("AnimationData", newAnimation); + player.SetData("Animation", newAnimation); + } + + public static void SyncAnimation(this Player player, List animations) + { + if (animations.Count is 0) + return; + + string animationName = animations.ElementAt(0); + List nextAnimations = animations.Skip(1).ToList(); + player.SyncAnimation(animationName); + + if (nextAnimations.Count is 0) + { + animationPair.Remove(player); + return; + } + + player.TriggerEvent("SERVER:QueueAnimation", animationName); + if (animationPair.ContainsKey(player)) + animationPair[player] = nextAnimations; + else + animationPair.Add(player, nextAnimations); + } + + /// Check if Player has any Animation playing. + /// + /// + public static bool HasAnimation(this Player player) + { + return player.HasData("Animation"); + } + + /// Check if Player has a specific Animation playing. + /// + /// Name of requested animation + public static bool HasAnimation(this Player player, dynamic animationName) + { + return player.HasData("Animation") && (player.GetData("Animation") == animationName); + } + + public static void ClearAnimation(this Player player) + { + if (!player.HasData("Animation")) + return; + + player.ResetData("Animation"); + player.ResetSharedData("AnimationData"); + } + } + + public class AnimationSyncEvents : Script + { + [RemoteEvent("CLIENT:AnimPairTransition")] + public void AnimPairTransition(Player player) + { + if (!AnimationSync.animationPair.ContainsKey(player)) + return; + + List animationPairs = AnimationSync.animationPair[player]; + + player.SyncAnimation(animationPairs); + } + + [RemoteEvent("CLIENT:ClearAnimationData")] + public void ClearAnimationData(Player player, bool checkTransition) + { + player.ClearAnimation(); + if (checkTransition) + { + AnimPairTransition(player); + } + else + { + player.ClearAttachments(); + PositionManager.cuffPoints.Remove(player); + } + } + + [ServerEvent(Event.PlayerWeaponSwitch)] + public void OnPlayerWeaponSwitch(Player player, WeaponHash oldWeapon, WeaponHash newWeapon) + { + if (!player.HasAnimation()) return; + NAPI.Player.SetPlayerCurrentWeapon(player, WeaponHash.Unarmed); + } + + [ServerEvent(Event.PlayerConnected)] + public void OnPlayerConnected(Player player) + { + player.TriggerEvent("SERVER:LoadAnimations"); + } + + [ServerEvent(Event.PlayerDeath)] + public void OnPlayerDeath(Player player, Player killer, uint reason) + { + player.ClearAnimation(); + } + } +} diff --git a/ReallifeGamemode.Server/Util/AttachmentSync.cs b/ReallifeGamemode.Server/Util/AttachmentSync.cs index 822a5c76..5828917a 100644 --- a/ReallifeGamemode.Server/Util/AttachmentSync.cs +++ b/ReallifeGamemode.Server/Util/AttachmentSync.cs @@ -1,5 +1,4 @@ - -using System; +using System; using System.Collections.Generic; using System.Linq; using GTANetworkAPI; @@ -12,7 +11,7 @@ public static class AttachmentSync /// The entity to attach the object to /// The attachment, should be in string or long type /// Pass true to remove the specified attachment, false otherwise. - + public static void AddAttachment(this Entity entity, dynamic attachment, bool remove) { if (!entity.HasData("Attachments")) @@ -143,18 +142,13 @@ public class AttachmentSyncExample : Script if (!player.HasAttachment("ammobox")) { player.AddAttachment("ammobox", false); - player.PlayAnimation("anim@heists@box_carry@", "idle", 49); + //player.SyncAnimation("carryBox"); //veh.AddAttachment("weapondeal1", false); //veh.AddAttachment("weapondeal2", false); } else { - player.StopAnimation(); - player.ClearAttachments(); } } - - } - diff --git a/ReallifeGamemode.Server/Wanted/Jail.cs b/ReallifeGamemode.Server/Wanted/Jail.cs index c9cfe660..d8273fed 100644 --- a/ReallifeGamemode.Server/Wanted/Jail.cs +++ b/ReallifeGamemode.Server/Wanted/Jail.cs @@ -10,6 +10,7 @@ using ReallifeGamemode.Server.Services; using ReallifeGamemode.Services; using System.Diagnostics; using Newtonsoft.Json; +using ReallifeGamemode.Server.Managers; namespace ReallifeGamemode.Server.Wanted { @@ -18,104 +19,36 @@ namespace ReallifeGamemode.Server.Wanted private static Dictionary Jailtime { get; set; } = new Dictionary(); //time in seconds - public static void Check_PutBehindBars(Player client, bool announceHq = true) + public static void Check_PutBehindBars(User user) { - User user = client.GetUser(); + user.SetBlipAndNametagColor(); + Player player = user.Player; + PositionManager.cuffPoints.Remove(player); if (user.JailTime > 0) { - client.RemoveAllWeapons(); - client.Health = 100; - client.Armor = 0; + player.RemoveAllWeapons(); + player.Health = 100; + player.Armor = 0; Random rnd = new Random(); int rndInt = rnd.Next(1, 3); if (rndInt == 1) - NAPI.Player.SpawnPlayer(client, new Vector3(458.9842, -997.2126, 24.91485)); //send client to jail + NAPI.Player.SpawnPlayer(player, new Vector3(458.9842, -997.2126, 24.91485)); //send client to jail if (rndInt == 2) - NAPI.Player.SpawnPlayer(client, new Vector3(459.696, -994.3766, 24.91486)); //send client to jail + NAPI.Player.SpawnPlayer(player, new Vector3(459.696, -994.3766, 24.91486)); //send client to jail if (rndInt == 3) - NAPI.Player.SpawnPlayer(client, new Vector3(458.3372, -1001.258, 24.91485)); //send client to jail + NAPI.Player.SpawnPlayer(player, new Vector3(458.3372, -1001.258, 24.91485)); //send client to jail Jailtime[user.Id] = user.JailTime; // 54 sec for each wanted star -> in total 45min for 50 Wanteds - int timeMinutes = 0; + int timeMinutes; - if (((int)(user.JailTime / 60)) <= 1 && user.JailTime != 0) + if ((user.JailTime / 60) <= 1 && user.JailTime != 0) { timeMinutes = 1; } else { - timeMinutes = (int)(user.JailTime / 60); + timeMinutes = user.JailTime / 60; } - client.TriggerEvent("jailTime", timeMinutes); - return; - } - if (user.Wanteds <= 0) - return; - using (var dbContext = new DatabaseContext()) - { - foreach (var copPlayer in NAPI.Pools.GetAllPlayers()) - { - if (!copPlayer.IsLoggedIn()) continue; - User cop = copPlayer.GetUser(); - if (cop?.FactionId == 1 || cop?.FactionId == 3) - { - int jailTime = user.Wanteds * 54; - if (cop.GetData("duty") && copPlayer.Position.DistanceTo2D(client.Position) <= 200 && (!copPlayer.HasData("isDead") || copPlayer.GetData("isDead") != true)) - { - if (!client.HasData("isDead") || client.GetData("isDead") == false) - { - jailTime /= 2; - } - - User clientUser = client.GetUser(dbContext); - - clientUser.JailTime = jailTime; - Jailtime[user.Id] = jailTime; // 54 sec for each wanted star -> in total 45min for 50 Wanteds - - clientUser.Wanteds = 0; - client.SetData("isDead", false); - client.RemoveAllWeapons(); - client.SetSharedData("blipColor", 0); - Random rnd = new Random(); - int rndInt = rnd.Next(1, 3); - if (rndInt == 1) - NAPI.Player.SpawnPlayer(client, new Vector3(458.9842, -997.2126, 24.91485)); //send client to jail - if (rndInt == 2) - NAPI.Player.SpawnPlayer(client, new Vector3(459.696, -994.3766, 24.91486)); //send client to jail - if (rndInt == 3) - NAPI.Player.SpawnPlayer(client, new Vector3(458.3372, -1001.258, 24.91485)); //send client to jail - - client.TriggerEvent("onPlayerRevived"); - MedicTask task = Medic.ReviveTasks.FirstOrDefault(t => t.Victim == client.Name); - Medic.RemoveTaskFromList(task); - client.Health = 100; - - int timeMinutes = 0; - - if (((int)(Jailtime[user.Id] / 60)) <= 1 && Jailtime[user.Id] != 0) - { - timeMinutes = 1; - } - else - { - timeMinutes = (int)(Jailtime[user.Id] / 60); - } - - client.TriggerEvent("jailTime", JsonConvert.SerializeObject(timeMinutes)); - - clientUser.SetBlipAndNametagColor(); - - if (announceHq) - { - ChatService.BroadcastFaction("!{#8181E9}HQ: " + user.Name + " wurde ins Gefängnis geliefert.", new List() { 1, 3 }); - } - } - else if (user.Wanteds > 0 && user.JailTime <= 0) - { - ChatService.BroadcastFaction("!{#8181E9}HQ: Der Verdächtigte " + user.Name + " wurde soeben ins Krankenhaus eingeliefert.", new System.Collections.Generic.List() { 1, 3 }); - } - } - } - dbContext.SaveChanges(); + player.TriggerEvent("jailTime", timeMinutes); } } @@ -136,23 +69,31 @@ namespace ReallifeGamemode.Server.Wanted public static void JailIn_Elapsed() { + using var dbContext = new DatabaseContext(); foreach (var player in NAPI.Pools.GetAllPlayers()) { - User user = player.GetUser(); - if (user != null && !Jailtime.ContainsKey(user.Id)) + if (player.Position.DistanceTo(new Vector3(458.9842, -997.2126, 24.91485)) > 7) { - foreach (var copPlayer in NAPI.Pools.GetAllPlayers()) + continue; + } + + User user = player.GetUser(dbContext); + + if (user != null && user.Wanteds > 0 && !Jailtime.ContainsKey(user.Id)) + { + foreach (var copPlayer in NAPI.Pools.GetAllPlayers().Where(u => u.IsLoggedIn() && u.IsDuty() && u.IsAlive())) { - if (!copPlayer.IsLoggedIn()) return; - User cop = copPlayer.GetUser(); - if (cop.GetData("duty") && copPlayer.Position.DistanceTo2D(player.Position) <= 500 && (!copPlayer.HasData("isDead") || copPlayer.GetData("isDead") != true)) + User copUser = copPlayer.GetUser(dbContext); + if (copUser.FactionId == 1 || copUser.FactionId == 3) { - if (player.Position.DistanceTo2D(new Vector3(458.9842, -997.2126, 24.91485)) <= 7) + if (player.Position.DistanceTo(copPlayer.Position) < 5) { - if (player.Position.DistanceTo2D(copPlayer.Position) < 5) - { - Check_PutBehindBars(player); - } + user.SetJailTime(false); + user.SetBlipAndNametagColor(); + user.AnnouncePlayerJailedIn(); + dbContext.SaveChanges(); + Check_PutBehindBars(user); + break; } } } @@ -183,9 +124,10 @@ namespace ReallifeGamemode.Server.Wanted public static void JailOut_Elapsed() { + using var dbContext = new DatabaseContext(); foreach (var player in NAPI.Pools.GetAllPlayers()) { - User user = player.GetUser(); + User user = player.GetUser(dbContext); if (user != null && Jailtime.ContainsKey(user.Id)) { if (user.JailTime <= 0) @@ -197,11 +139,7 @@ namespace ReallifeGamemode.Server.Wanted } if (user.JailTime > 0) { - using (var dbContext = new DatabaseContext()) - { - player.GetUser(dbContext).JailTime -= 60; - dbContext.SaveChanges(); - } + user.JailTime -= 60; int timeMinutes = 0; @@ -219,15 +157,16 @@ namespace ReallifeGamemode.Server.Wanted } } } + dbContext.SaveChanges(); } - + [RemoteEvent("setPrisonerFree")] public void Release_Jail(Player cop, string client) { Player player = PlayerService.GetPlayerByNameOrId(client); if (player == null) return; - + User user = player.GetUser(); if (Jailtime.ContainsKey(user.Id)) { @@ -248,15 +187,15 @@ namespace ReallifeGamemode.Server.Wanted public static void Release_Jail_Admin(Player admin, Player target) { - User user = target.GetUser(); + using var dbContext = new DatabaseContext(); + User user = target.GetUser(dbContext); if (Jailtime.ContainsKey(user.Id)) { Jailtime.Remove(user.Id); - using (var dbContext = new DatabaseContext()) - { - target.GetUser(dbContext).JailTime = 0; - dbContext.SaveChanges(); - } + + user.JailTime = 0; + dbContext.SaveChanges(); + target.Health = 100; target.Position = new Vector3(427.879, -984.65, 30.71); diff --git a/ReallifeGamemode.Server/Wanted/WantedEscapeTimer.cs b/ReallifeGamemode.Server/Wanted/WantedEscapeTimer.cs index 5fc94dee..a9640a8b 100644 --- a/ReallifeGamemode.Server/Wanted/WantedEscapeTimer.cs +++ b/ReallifeGamemode.Server/Wanted/WantedEscapeTimer.cs @@ -35,9 +35,10 @@ namespace ReallifeGamemode.Server.Wanted public static void Timer_Elapsed() { + using var dbContext = new DatabaseContext(); foreach (var player in NAPI.Pools.GetAllPlayers()) { - User user = player.GetUser(); + User user = player.GetUser(dbContext); if (user != null && user.Wanteds > 0) { if (!waTimer.ContainsKey(user.Id)) @@ -68,30 +69,10 @@ namespace ReallifeGamemode.Server.Wanted { ResetWantedTimeToElapse(player); player.SendChatMessage("~y~Du hast erfolgtreich einen Wanted abgetaucht."); - using (var dbContext = new DatabaseContext()) + user.Wanteds -= 1; + if (user.Wanteds == 0) { - player.GetUser(dbContext).Wanteds -= 1; - if (player.GetUser(dbContext).Wanteds == 0) - { - switch (player.GetUser(dbContext).FactionId) - { - case null: - player.SetSharedData("blipColor", 0); - break; - - case 8: - player.SetSharedData("blipColor", 83); - break; - - case 7: - player.SetSharedData("blipColor", 52); - break; - - case 4: - player.SetSharedData("blipColor", 5); - break; - } - } + user.SetBlipAndNametagColor(); dbContext.SaveChanges(); } } diff --git a/package-lock.json b/package-lock.json index 48e341a0..e523848f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,3 +1,4072 @@ { - "lockfileVersion": 1 + "name": "client", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helpers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", + "dev": true, + "requires": { + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "dev": true + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@types/node": { + "version": "11.13.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.18.tgz", + "integrity": "sha512-sMHdXLccscaxI+Hlzz58yLQue3lQyXP+6aQniDRi5oju3n0123kcjhicVGF20WF7cHiwJ2vxMbXc4skOclosoA==", + "dev": true + }, + "@types/ragemp-c": { + "version": "github:kookroach/types-ragemp-c#849cf51f85066c786ad3c563872ae74d9af2dd7c", + "from": "github:kookroach/types-ragemp-c#v1.0", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", + "dev": true, + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "elliptic": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", + "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "serialize-javascript": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz", + "integrity": "sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.2.tgz", + "integrity": "sha512-jvNoEQSPXJdssFwqPSgWjsOrb+ELoE+ILpHPKXC83tIxOlh2U75F1KuB2luLD/3a6/7K3Vw5pDn+hvu0C4AzSw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "ts-loader": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.4.5.tgz", + "integrity": "sha512-XYsjfnRQCBum9AMRZpk2rTYSVpdZBpZK+kDh0TeT3kxmQNBDVIeUjdPjY5RZry4eIAb8XHc4gYSUiUWPYvzSRw==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^3.1.4", + "semver": "^5.0.1" + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", + "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==", + "dev": true + }, + "uglify-js": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz", + "integrity": "sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ==", + "dev": true, + "requires": { + "commander": "~2.20.3", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz", + "integrity": "sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "uglify-js": "^3.6.0", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true + }, + "watchpack": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", + "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", + "dev": true, + "requires": { + "chokidar": "^2.1.8", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "webpack": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.38.0.tgz", + "integrity": "sha512-lbuFsVOq8PZY+1Ytz/mYOvYOo+d4IJ31hHk/7iyoeWtwN33V+5HYotSH+UIb9tq914ey0Hot7z6HugD+je3sWw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^1.0.0", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + } + }, + "webpack-cli": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.6.tgz", + "integrity": "sha512-0vEa83M7kJtxK/jUhlpZ27WHIOndz5mghWL2O53kiDoA9DIxSKnfqB92LoqEn77cT4f3H2cZm1BMEat/6AZz3A==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } } diff --git a/postbuild.ps1 b/postbuild.ps1 index c93bf675..4d1396ef 100644 --- a/postbuild.ps1 +++ b/postbuild.ps1 @@ -25,7 +25,7 @@ Set-Variable resourcesDir -option Constant -value "dotnet\resources" Set-Variable gamemodeDir -option Constant -value "reallife-gamemode" Set-Variable assetsDir -option Constant -value "client_packages\assets" Set-Variable indexJsDir -option Constant -value "client_packages" -Set-Variable dlcPacksDir -option Constant -value "source_dlcpacks" +Set-Variable dlcPacksDir -option Constant -value "client_packages\game_resources\dlcpacks" Set-Variable fullBuildDir -option Constant -value "$serverProjectPath\$buildDirectory" # create default config file if not exist