diff --git a/ReallifeGamemode.Client/Gui/blips.ts b/ReallifeGamemode.Client/Gui/blips.ts index 87c46329..b02ca9f7 100644 --- a/ReallifeGamemode.Client/Gui/blips.ts +++ b/ReallifeGamemode.Client/Gui/blips.ts @@ -1,51 +1,57 @@ -const Natives = { - SET_BLIP_CATEGORY: RageEnums.Natives.Ui.SET_BLIP_CATEGORY, - SHOW_HEADING_INDICATOR_ON_BLIP: RageEnums.Natives.Ui.SHOW_HEADING_INDICATOR_ON_BLIP, - SET_BLIP_AS_SHORT_RANGE: RageEnums.Natives.Ui.SET_BLIP_AS_SHORT_RANGE, - SET_BLIP_DISPLAY: RageEnums.Natives.Ui.SET_BLIP_DISPLAY -}; + export default function playerBlips() { - /* mp.events.add("entityStreamIn", (entity) => { - if (entity.type === "player") { - var entityMp = entity; + var playerBlipMap: Map; + var ready = false; - mp.gui.chat.push("Player recieved: Yes"); + setInterval(() => { + if (!ready) return; + if (!playerBlipMap) playerBlipMap = new Map(); - let color = parseInt(entity.getVariable("blipColor")); + mp.players.forEachInStreamRange( + (player) => { + if (mp.players.local == player) + return; + + if (!playerBlipMap.has(player)) { + let pBlip = mp.blips.new(1, player.position, { + shortRange: true, + dimension: mp.players.local.dimension, + drawDistance: 300 + }); - mp.gui.chat.push("Color : " + color); + pBlip.setCategory(7); + pBlip.setDisplay(8); + playerBlipMap.set(player, pBlip); + } + let pBlip = playerBlipMap.get(player); + let color = player.getVariable("blipColor"); + pBlip.setColour(isNaN(color) ? 0 : color); + pBlip.setPosition(player.position.x, player.position.y, player.position.z); + }); + }, 50); - entity.createBlip(1); - - mp.gui.chat.push(parseInt(entity.blip) == 0 ? "Blip was not created" : "Blip was created"); - - mp.gui.chat.push("entity.blip is actually " + entity.blip); - var blip = entity.blip; - - mp.gui.chat.push("1 -" + blip.getAlpha() + " 2- " + blip.doesExist() + " 3-" + blip.dimension + " 4-" + entityMp.dimension); - - entity.setBlipColor(isNaN(color) ? 0 : color); - - mp.game.invoke(Natives.SET_BLIP_CATEGORY, entity.blip, 7); - mp.game.invoke(Natives.SHOW_HEADING_INDICATOR_ON_BLIP, entity.blip, true); - mp.game.invoke(Natives.SET_BLIP_AS_SHORT_RANGE, entity.blip, true); - mp.game.invoke(Natives.SET_BLIP_DISPLAY, entity.blip, 8); + mp.events.add("playerReady", () => { + ready = true; + }); + mp.events.add("entityStreamOut", (entity) => { + if (playerBlipMap && entity.type === "player") { + if (playerBlipMap.has(entity)) { + var pBlip = playerBlipMap.get(entity); + pBlip.destroy(); + playerBlipMap.delete(entity); + } } }); - */ - mp.events.addDataHandler("blipColor", (entity, value) => { if (entity.type === "player") { - //mp.gui.chat.push("Setting Blip color..."); let color = parseInt(value); entity.setBlipColor(isNaN(color) ? 0 : color); - // mp.gui.chat.push("Player blip color was set."); } }); } \ No newline at end of file diff --git a/ReallifeGamemode.Client/Gui/licenses.ts b/ReallifeGamemode.Client/Gui/licenses.ts index e48a0eea..4222b3e4 100644 --- a/ReallifeGamemode.Client/Gui/licenses.ts +++ b/ReallifeGamemode.Client/Gui/licenses.ts @@ -20,7 +20,7 @@ export default function licenses(globalData: IGlobalData): void { mp.events.add("CEF:LicenseLoaded", () => { licenseBrowser.execute(`add_licenses('${JSON.stringify(globalInfo)}');`); licenseBrowser.execute(`add_licensesholder('${JSON.stringify(globalName)}');`); - licenseTimer = setInterval(DestroyLicenses, 7000); + licenseTimer = setInterval(DestroyLicenses, 15000); }); diff --git a/ReallifeGamemode.Client/Gui/nametags.ts b/ReallifeGamemode.Client/Gui/nametags.ts index df6fc96d..c780693d 100644 --- a/ReallifeGamemode.Client/Gui/nametags.ts +++ b/ReallifeGamemode.Client/Gui/nametags.ts @@ -1,27 +1,36 @@ -const maxDistance = 25 * 25; +import { IGame, IEntity } from "../game"; +import game from ".."; + + +const maxDistance = 40 * 40; const width = 0.03; const height = 0.0065; const border = 0.001; -const color = [73, 137, 0, 255]; -var faction; -var playerColors = []; + +const alpha = 250; + +const colors = [ + { id: -2, color: [0, 255, 255, alpha] }, //support + { id: -1, color: [255, 100, 0, alpha] }, //wanted + + { id: 0, color: [255, 255, 255, alpha] }, //civil + + //1 to n + { id: 1, color: [0, 95, 190, alpha] }, //pd + { id: 2, color: [200, 0, 0, alpha] }, //lsed + { id: 3, color: [0, 0, 170, alpha] }, //fib + { id: 4, color: [255, 180, 0, alpha] }, //trucker + { id: 5, color: [255, 255, 255, alpha] }, //terroristen + { id: 6, color: [255, 255, 255, alpha] }, //hitman + { id: 7, color: [0, 64, 0, alpha] }, //grove + { id: 8, color: [171, 0, 150, alpha] }, //ballas + { id: 9, color: [0, 166, 133, alpha] }, //news +]; + export default function customNametags() { mp.nametags.enabled = false; - /* - mp.events.addDataHandler("nameTagColor", (entity, value) => { - if (entity.type === "player") { - var color = JSON.parse(value); - entity.setVariable('nametagColor',color) - //mp.gui.chat.push(color); - } - }); - - mp.events.add('setNameTag', (value) => { - var color = JSON.parse(value); - mp.gui.chat.push(color); - });*/ mp.events.add('render', (nametags) => { const graphics = mp.game.graphics; @@ -40,11 +49,15 @@ export default function customNametags() { var armour = player.getArmour() / 100; y -= scale * (0.005 * (screenRes.y / 1080)); + + let colorId = game.players.at(player.remoteId).nametagColor; + + let color = colors.find(c => c.id === colorId).color; + mp.game.graphics.drawText(player.name + " (" + player.remoteId + ")", [x, y], { font: 4, - //color: [player.data.nametagColor[0], player.data.nametagColor[1], player.data.nametagColor[2], 200], //Grove //Ballas 171 0 207 //PD 0 95 190 //FIB 0 0 170 LSED 147 0 0 NR 0 166 133 Trucker 255 162 Support 0 255 255 Zivilist 255 255 255 - color: [255, 255, 255, 255], + color: [color[0], color[1], color[2], color[3]], scale: [0.4, 0.4], outline: true, centre: false diff --git a/ReallifeGamemode.Client/Interaction/clothes/ClotheShop.ts b/ReallifeGamemode.Client/Interaction/clothes/ClotheShop.ts index f7c8088c..23ca0a8b 100644 --- a/ReallifeGamemode.Client/Interaction/clothes/ClotheShop.ts +++ b/ReallifeGamemode.Client/Interaction/clothes/ClotheShop.ts @@ -26,25 +26,25 @@ const Color = NativeUI.Color; export default function clotheShopList(globalData: IGlobalData) { const categoryTitles = { clothes: { - 1: "Masks", - 2: "Hair Styles", - 3: "Torsos", - 4: "Legs", - 5: "Bags and Parachutes", - 6: "Shoes", + 1: "Masken", + 2: "Haar Stil", + 3: "Oberkörper", + 4: "Hosen", + 5: "Taschen und Fallschirme", + 6: "Schuhe", 7: "Accessories", 8: "Undershirts", - 9: "Body Armors", + 9: "Schutzwesten", 10: "Decals", - 11: "Tops" + 11: "Oberteile" }, props: { - 0: "Hats", - 1: "Glasses", - 2: "Ears", - 6: "Watches", - 7: "Bracelets" + 0: "Kopfbedeckungen", + 1: "Brillen", + 2: "Ohrringe", + 6: "Uhren", + 7: "Armbänder" } }; @@ -53,7 +53,12 @@ export default function clotheShopList(globalData: IGlobalData) { var myVar; let mainMenu = null; - let categoryMenus = []; + let categoryMenu = null; + + let clotheMenus = []; + + + let clothingData = []; let currentMenuIdx = -1; let menuTransition = false; // workaround for ItemSelect event being called twice between menu transitions @@ -148,22 +153,21 @@ export default function clotheShopList(globalData: IGlobalData) { } function addClothingItems(type, bannerSprite, key, value, gender) { - var categoryMenu; var cloth = []; var tx = []; - if (Object.keys(categoryMenus).length > 0) { - for (var i = 0; i < categoryMenus.length; i++) { - if (categoryMenus[i].slotIdx == key) { + if (Object.keys(clotheMenus).length > 0) { + for (var i = 0; i < clotheMenus.length; i++) { + if (clotheMenus[i].slotIdx == key) { return; } } - mainMenu.AddItem(new UIMenuItem(categoryTitles[type][key], `${type === "props" ? "Prop category." : "Clothing category."}`)); + mainMenu.AddItem(new UIMenuItem(categoryTitles[type][key], `${type === "props" ? " " : " "}`)); // Create category menu categoryMenu = new UIMenu("", categoryTitles[type][key].toUpperCase(), new Point(0, 0), bannerSprite.library, bannerSprite.texture); categoryMenu.Visible = false; } else { - mainMenu.AddItem(new UIMenuItem(categoryTitles[type][key], `${type === "props" ? "Prop category." : "Clothing category."}`)); + mainMenu.AddItem(new UIMenuItem(categoryTitles[type][key], `${type === "props" ? " " : " "}`)); // Create category menu categoryMenu = new UIMenu("", categoryTitles[type][key].toUpperCase(), new Point(0, 0), bannerSprite.library, bannerSprite.texture); categoryMenu.Visible = false; @@ -172,21 +176,21 @@ export default function clotheShopList(globalData: IGlobalData) { mainMenu.Item // Fill it - for (const item of value) { if (item.ComponentId == key) { + var txData = getClothingName(key, item.ClotheId, gender); for (const x of txData) { - var itemDescription = (key === 11 ? mp.game.ui.getLabelText(x.undershirt[1].GXT) : "Clothing item."); + var itemDescription = (key === 11 ? mp.game.ui.getLabelText(x.undershirt[1].GXT) : " "); //var itemDescription = (key === 11 ? x.undershirt[1].GXT + " - " + x.id: "Clothing item."); if (itemDescription == "NULL") { - itemDescription = "Clothing item."; + itemDescription = ""; } const tempItem = new UIMenuItem(mp.game.ui.getLabelText(x.data[0].GXT), itemDescription); //const tempItem = new UIMenuItem(x.data[0].GXT + " - " + x.id , itemDescription); - tempItem.SetRightLabel(`${item.Price > 0 ? `$${item.Price}` : "FREE"}`); + tempItem.SetRightLabel(`${item.Price > 0 ? `$${item.Price}` : "KOSTENLOS"}`); categoryMenu.AddItem(tempItem); @@ -195,18 +199,19 @@ export default function clotheShopList(globalData: IGlobalData) { } } } - - categoryMenus.push({ + clotheMenus.push({ menu: categoryMenu, type: type, slotIdx: Number(key), item: cloth, texture: tx }); + + } function submenuItemChangeHandler(newIndex) { - const currentMenu = categoryMenus[currentMenuIdx]; + const currentMenu = clotheMenus[currentMenuIdx]; const currentItem = currentMenu.item[newIndex]; const currentTexture = currentMenu.texture[newIndex].id; //const currentItem = clothingData[currentMenu.type][currentMenu.slotIdx][newIndex]; @@ -263,7 +268,7 @@ export default function clotheShopList(globalData: IGlobalData) { if (dist > 3) { clearInterval(myVar); resetPreview(); - if (currentMenuIdx !== -1) categoryMenus[currentMenuIdx].menu.Close(); + if (currentMenuIdx !== -1) clotheMenus[currentMenuIdx].menu.Close(); if (mainMenu && mainMenu.Visible) mainMenu.Close(); } } @@ -302,13 +307,13 @@ export default function clotheShopList(globalData: IGlobalData) { mp.gui.chat.show(false); // Reset some variables - categoryMenus = []; + clotheMenus = []; currentMenuIdx = -1; menuTransition = false; lastClothing = null; // Create a new main menu - mainMenu = new UIMenu("", "SELECT A CATEGORY", new Point(0, 0), bannerSprite.library, bannerSprite.texture); + mainMenu = new UIMenu("", "Wählen Sie eine Kategorie", new Point(0, 0), bannerSprite.library, bannerSprite.texture); mainMenu.Visible = true; // Update clothingData @@ -325,7 +330,7 @@ export default function clotheShopList(globalData: IGlobalData) { // for (const [key, value] of Object.entries(clothingData.props)) addClothingItems("props", bannerSprite, key, value); // Submenu events - for (const item of categoryMenus) { + for (const item of clotheMenus) { // Preview hovering item item.menu.IndexChange.on(submenuItemChangeHandler); @@ -336,7 +341,7 @@ export default function clotheShopList(globalData: IGlobalData) { return; } - const currentMenu = categoryMenus[currentMenuIdx]; + const currentMenu = clotheMenus[currentMenuIdx]; const currentItem = currentMenu.item[itemIndex]; const currentTexture = currentMenu.texture[itemIndex].id; if (currentMenu.slotIdx == 11) { @@ -367,9 +372,10 @@ export default function clotheShopList(globalData: IGlobalData) { }); } + // Main menu events mainMenu.ItemSelect.on((selectedItem, itemIndex) => { - const nextMenu = categoryMenus[itemIndex]; + const nextMenu = clotheMenus[itemIndex]; const slot = Number(nextMenu.slotIdx); lastClothing = { @@ -386,7 +392,8 @@ export default function clotheShopList(globalData: IGlobalData) { nextMenu.menu.Visible = true; menuTransition = true; - submenuItemChangeHandler(nextMenu.menu.CurrentSelection); + submenuItemChangeHandler(nextMenu.menu.CurrentSelection); + }); mainMenu.MenuClose.on(() => { @@ -396,6 +403,7 @@ export default function clotheShopList(globalData: IGlobalData) { currentMenuIdx = -1; lastClothing = null; }); + } }); @@ -410,7 +418,7 @@ export default function clotheShopList(globalData: IGlobalData) { }); mp.events.add("clothesMenu:close", () => { - if (currentMenuIdx !== -1) categoryMenus[currentMenuIdx].menu.Close(); + if (currentMenuIdx !== -1) clotheMenus[currentMenuIdx].menu.Close(); if (mainMenu && mainMenu.Visible) mainMenu.Close(); }); diff --git a/ReallifeGamemode.Client/Interaction/factioninteraction.ts b/ReallifeGamemode.Client/Interaction/factioninteraction.ts index dfa95f1c..392030df 100644 --- a/ReallifeGamemode.Client/Interaction/factioninteraction.ts +++ b/ReallifeGamemode.Client/Interaction/factioninteraction.ts @@ -13,8 +13,6 @@ export default function factionInteraction(globalData: IGlobalData) { var screenRes = mp.game.graphics.getScreenResolution(0, 0); var player = mp.players.local; var tasks; - var deathSeconds; - var initTasks; var newTasks; var sorting = 0; var firstSorting = true; @@ -27,8 +25,7 @@ export default function factionInteraction(globalData: IGlobalData) { var rangeLeft; var sortText; var deadRespawned = false; - var timeLeft = 0; - var deathTime; + var timeLeft = null; var ticketName: string; var pointsName: string; @@ -40,6 +37,7 @@ export default function factionInteraction(globalData: IGlobalData) { /*mp.events.add("updateFactionBlips", (type, taskList) => { }); + });*/ mp.events.add("showFactionInteractionLSPD", (userFactionId, isDuty, userFactionName, isFactionLeader) => { //LSPD @@ -280,15 +278,11 @@ export default function factionInteraction(globalData: IGlobalData) { }); - mp.events.add("showMedicTasks", (type, taskList, deathTimes) => { + mp.events.add("showMedicTasks", (type, taskList) => { tasks = JSON.parse(taskList); - deathSeconds = JSON.parse(deathTimes); - if (sorting === 0) { - initTasks = tasks; - } - mp.events.call("sortFactionTasks", false); + //mp.events.call("sortFactionTasks", false); mp.gui.chat.activate(false); globalData.InMenu = true; @@ -329,7 +323,6 @@ export default function factionInteraction(globalData: IGlobalData) { dimension: 0 }); reviveTaskMenuMedic.Close(); - deathTime = deathSeconds[index]; mp.gui.chat.activate(true); globalData.InMenu = false; ambulanceImagePos = 0.325 @@ -337,7 +330,6 @@ export default function factionInteraction(globalData: IGlobalData) { taskFinish = tasks[index].Position; taskRange = mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z, true); activeTask = tasks[index]; - } } }); @@ -407,6 +399,7 @@ export default function factionInteraction(globalData: IGlobalData) { } }); + /* mp.events.add("sortFactionTasks", (sortByKey) => { if (firstSorting) { sortText = "Nach Uhrzeit"; @@ -462,7 +455,7 @@ export default function factionInteraction(globalData: IGlobalData) { } } } - }); + });*/ function getDistance1(index) { return mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, newTasks[index].Position.x, newTasks[index].Position.y, newTasks[index].Position.z, true).toFixed(2); @@ -476,27 +469,40 @@ export default function factionInteraction(globalData: IGlobalData) { }); mp.events.add("destroyMedicTaskCheckpoint", () => { - activeCheckpoint.destroy(); - activeTask = null; - timeLeft = 0; - mp.events.callRemote("MedicTaskTimeout"); + if (activeCheckpoint) { + activeCheckpoint.destroy(); + activeCheckpoint = null; + activeTask = null; + timeLeft = null; + mp.events.callRemote("MedicTaskTimeout"); + } }); mp.events.add('playerEnterCheckpoint', (activeCheckpoint) => { if (deadRespawned == true) { activeCheckpoint.destroy(); + activeCheckpoint = null; mp.events.callRemote("PayCutMedicEarnings"); activeTask = null; deadRespawned = false; - timeLeft = 0; + timeLeft = null; } else if (activeTask.Type == 1){ activeCheckpoint.destroy(); + activeCheckpoint = null; mp.events.callRemote("delHealTaskAsMedic", activeTask.Victim); - activeTask = null; + activeTask = null; + timeLeft = null; + } + }); + + mp.events.add('setTaskTimeLeft', (taskTimeLeft) => { + if (activeTask) { + timeLeft = taskTimeLeft; } }); mp.events.add('render', () => { + if (activeTask) { rangeLeft = mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, taskFinish.x, taskFinish.y, taskFinish.z, true).toFixed(2); if (rangeLeft > 1.9) { @@ -520,34 +526,35 @@ export default function factionInteraction(globalData: IGlobalData) { var currentDate = new Date(); - if (deadRespawned == false) { - timeLeft = Math.round(Math.abs(Math.floor(currentDate.getTime() / 1000) - deathTime - 30)); - if (timeLeft < 1) mp.events.call("cutMedicEarnings"); - } else { - timeLeft = Math.round(Math.abs(Math.floor(currentDate.getTime() / 1000) - deathTime - 60)); - if (timeLeft < 1) mp.events.call("destroyMedicTaskCheckpoint"); - } + if (timeLeft != null) { + if (deadRespawned == false) { + //timeLeft = Math.round(Math.abs(Math.floor(currentDate.getTime() / 1000) - activeTask.TimeLeft - 60)); + if (timeLeft < 120) mp.events.call("cutMedicEarnings"); + } else { + //timeLeft = Math.round(Math.abs(Math.floor(currentDate.getTime() / 1000) - activeTask.TimeLeft - 120)); + if (timeLeft < 1) mp.events.call("destroyMedicTaskCheckpoint"); + } - /*DEBUG TIMER für die Zeit die man noch hat zur Wiederbelebung - if (deadRespawned == false) { - mp.game.graphics.drawText(timeLeft.toString() + "s ", [0.5, 0.88], { - font: 7, - color: [60, 179, 113, 255], - scale: [0.3, 0.3], - outline: true, - centre: true - }); - } else { - { - mp.game.graphics.drawText(timeLeft.toString() + "s", [0.5, 0.88], { + if (deadRespawned == false) { + mp.game.graphics.drawText(timeLeft + "s", [0.5, 0.85], { font: 7, - color: [255, 203, 145, 255], - scale: [0.3, 0.3], + color: [60, 179, 113, 255], + scale: [0.5, 0.5], outline: true, centre: true }); - } - } */ + } else { + { + mp.game.graphics.drawText(timeLeft + "s", [0.5, 0.85], { + font: 7, + color: [255, 203, 145, 255], + scale: [0.5, 0.5], + outline: true, + centre: true + }); + } + } + } } }); } \ No newline at end of file diff --git a/ReallifeGamemode.Client/Interaction/interactionmenu.ts b/ReallifeGamemode.Client/Interaction/interactionmenu.ts index 1946fc78..d664ecf3 100644 --- a/ReallifeGamemode.Client/Interaction/interactionmenu.ts +++ b/ReallifeGamemode.Client/Interaction/interactionmenu.ts @@ -169,7 +169,6 @@ export default function (globalData: IGlobalData) { } else if (item === payItem) { mp.gui.chat.activate(true); mp.gui.cursor.show(true, true); - globalData.InMenu = true; var input = new InputHelper("Welchem Spieler möchtest du Geld geben (Name / ID)?", globalData); input.show(); input.getValue(name => { @@ -226,6 +225,14 @@ export default function (globalData: IGlobalData) { menuItem.SetRightLabel(data.regDate); accountMenu.AddItem(menuItem); + menuItem = new UIMenuItem("Spielzeit"); + menuItem.SetRightLabel(data.playTime + "h"); + accountMenu.AddItem(menuItem); + + menuItem = new UIMenuItem("Verwarnungen"); + menuItem.SetRightLabel("~r~" + data.userWarn); + accountMenu.AddItem(menuItem); + menuItem = new UIMenuItem("Adminrang"); menuItem.SetRightLabel(data.adminLevel); accountMenu.AddItem(menuItem); diff --git a/ReallifeGamemode.Client/assets/js/inputhelper/application.js b/ReallifeGamemode.Client/assets/js/inputhelper/application.js index a4435abf..8513019d 100644 --- a/ReallifeGamemode.Client/assets/js/inputhelper/application.js +++ b/ReallifeGamemode.Client/assets/js/inputhelper/application.js @@ -6,7 +6,7 @@ let description = document.getElementById('description'); let input = document.getElementById('input'); let close = document.getElementById('close'); -function setInputFieldType(value) { +fzunction setInputFieldType(value) { if (input.type == value) return; var field = document.createElement('input'); diff --git a/ReallifeGamemode.Client/core/rage-mp/entities.ts b/ReallifeGamemode.Client/core/rage-mp/entities.ts index 2a519e70..df59090c 100644 --- a/ReallifeGamemode.Client/core/rage-mp/entities.ts +++ b/ReallifeGamemode.Client/core/rage-mp/entities.ts @@ -1,4 +1,4 @@ -import { IEntity, IPlayer, IEntityAttachments, IEntityAttachmentPool, IPlayerPool, IVehicle, IVehiclePool, VehicleSeat, EntityType, IObjectPool, IObject } from "../../game"; +import { IEntity, IPlayer, IEntityAttachments, IEntityAttachmentPool, IPlayerPool, IVehicle, IVehiclePool, VehicleSeat, EntityType } from "../../game"; import { parseJson } from "../../util"; import game from "../.."; @@ -15,6 +15,13 @@ class RageEntity implements IEntity { return this.entity.id; } + get attachments(): number { + var color = this.entity.getVariable("nametagColor"); + if (!color) + return 0; + return color; + } + get handle() { return this.entity.handle; } @@ -64,6 +71,13 @@ class RagePlayer extends RageEntity implements IPlayer { return this.player.name; } + get nametagColor(): number { + var color = this.player.getVariable("nameTagColor"); + if (!color) + return 0; + return color; + } + get vehicle(): IVehicle { if (!this.player) { return null; @@ -176,19 +190,6 @@ class RagePlayerPool implements IPlayerPool { } } -class RageObject extends RageEntity implements IObject { - public object: ObjectMp; - public __attachmentData: object; - - constructor(object: ObjectMp, attachmentData: object) { - if (!object) { - throw "Object is undefined" - } - super(object); - this.object = object; - this.__attachmentData = attachmentData; - } -} class RageVehicle extends RageEntity implements IVehicle { private vehicle: VehicleMp; @@ -227,36 +228,6 @@ class RageVehicle extends RageEntity implements IVehicle { } -class RageObjectPool implements IObjectPool { - public attachmentDataMap: Map; - - - setData(entity: ObjectMp, attachmentData: object): void { - if (!this.attachmentDataMap) - this.attachmentDataMap = new Map(); - - this.attachmentDataMap.set(entity, attachmentData); - } - - at(id: number): IObject { - var object = mp.objects.atRemoteId(Number(id)); - - if (!object) - return null; - - return new RageObject(object, this.attachmentDataMap.get(object)); - } - - forEach(fn: (entity: IObject) => void): void { - mp.objects.forEach(e => { - if (!e) { - game.ui.sendChatMessage("forEach - e is null"); - return; - } - fn(new RageObject(e, this.attachmentDataMap.get(e))); - }) - } -} class RageVehiclePool implements IVehiclePool { at(id: number): IVehicle { @@ -288,6 +259,5 @@ export { RageEntityAttachmentPool, RageVehicle, RageVehiclePool, - RageObject, - RageObjectPool, + } \ No newline at end of file diff --git a/ReallifeGamemode.Client/core/rage-mp/game.ts b/ReallifeGamemode.Client/core/rage-mp/game.ts index 106f21fb..dc4e1514 100644 --- a/ReallifeGamemode.Client/core/rage-mp/game.ts +++ b/ReallifeGamemode.Client/core/rage-mp/game.ts @@ -1,18 +1,17 @@ -import { IGame, IUi, IEvents, IPlayerPool, IVehiclePool, IEntityAttachmentPool, IObjectPool } from "../../game"; +import { IGame, IUi, IEvents, IPlayerPool, IVehiclePool, IEntityAttachmentPool } from "../../game"; import RageEvents from "./events"; import RageUi from "./ui"; -import { RagePlayerPool, RageVehiclePool, RageEntityAttachmentPool, RageObjectPool } from "./entities"; +import { RagePlayerPool, RageVehiclePool, RageEntityAttachmentPool } from "./entities"; export default class RageGame implements IGame { players: IPlayerPool = new RagePlayerPool(); vehicles: IVehiclePool = new RageVehiclePool(); attachments: IEntityAttachmentPool = new RageEntityAttachmentPool(); - objects: IObjectPool = new RageObjectPool(); events: IEvents = new RageEvents; ui: IUi = new RageUi; - wait(ms: number): void { - mp.game.wait(ms); + async wait(ms: number): Promise { + await mp.game.waitAsync(ms); } disableDefaultEngineBehaviour(): void { diff --git a/ReallifeGamemode.Client/game.ts b/ReallifeGamemode.Client/game.ts index 1ed19923..84d9f67c 100644 --- a/ReallifeGamemode.Client/game.ts +++ b/ReallifeGamemode.Client/game.ts @@ -1,12 +1,11 @@ interface IGame { - wait(ms: number); + wait(ms: number): Promise; events: IEvents; ui: IUi; players: IPlayerPool; vehicles: IVehiclePool; attachments: IEntityAttachmentPool; - objects: IObjectPool; disableDefaultEngineBehaviour(): void; } @@ -53,11 +52,9 @@ interface IPlayer extends IEntity { inVehicle: boolean; name: string; vehicle: IVehicle; + nametagColor: number; } -interface IObject extends IEntity { - __attachmentData: object; -} interface IEntityAttachments { remoteId: any; @@ -79,9 +76,6 @@ interface IEntityPool { forEach(fn: (entity: TEntity) => void): void; } -interface IObjectPool extends IEntityPool { - setData(entity: ObjectMp, attachmentData: object): void; -} interface IPlayerPool extends IEntityPool { local: IPlayer; @@ -158,7 +152,6 @@ export { IBrowser, IPlayer, - IObject, IEntityAttachments, IEntityAttachmentPool, IVehicle, @@ -166,7 +159,6 @@ export { IEntityPool, IPlayerPool, IVehiclePool, - IObjectPool, EventName, Key, diff --git a/ReallifeGamemode.Client/global.d.ts b/ReallifeGamemode.Client/global.d.ts index 44ec321c..266c36d6 100644 --- a/ReallifeGamemode.Client/global.d.ts +++ b/ReallifeGamemode.Client/global.d.ts @@ -21,6 +21,8 @@ declare type AccountData = { factionVehicles: VehicleData[]; nextPayday: number; stateFaction: boolean; + playTime: number; + userWarn: number; } declare type VehicleData = { diff --git a/ReallifeGamemode.Client/index.ts b/ReallifeGamemode.Client/index.ts index 3dfc7746..70a08959 100644 --- a/ReallifeGamemode.Client/index.ts +++ b/ReallifeGamemode.Client/index.ts @@ -224,10 +224,9 @@ refuseCollector(); import PedCreator from './Ped/PedCreator'; PedCreator(); -/* + import attachmentManager from './util/attachmentMngr'; attachmentManager(game); -*/ import relativeVector from './util/relativevector'; relativeVector(); diff --git a/ReallifeGamemode.Client/inputhelper/index.ts b/ReallifeGamemode.Client/inputhelper/index.ts index ce216572..62e509ae 100644 --- a/ReallifeGamemode.Client/inputhelper/index.ts +++ b/ReallifeGamemode.Client/inputhelper/index.ts @@ -1,5 +1,4 @@ import game, { GlobalData } from ".."; -import { INSPECT_MAX_BYTES } from "buffer"; let disableInputTimer; export default class InputHelper { @@ -27,10 +26,6 @@ export default class InputHelper { this.value = undefined; mp.events.add('closeinputhelper', this.finish); - - mp.events.add("render", () => { - - }); } show() { diff --git a/ReallifeGamemode.Client/package-lock.json b/ReallifeGamemode.Client/package-lock.json index e8d2188d..e523848f 100644 --- a/ReallifeGamemode.Client/package-lock.json +++ b/ReallifeGamemode.Client/package-lock.json @@ -151,8 +151,8 @@ "dev": true }, "@types/ragemp-c": { - "version": "github:CocaColaBear/types-ragemp-c#6a118e6399b77a347ac67e07f6b15f842109b0ff", - "from": "github:CocaColaBear/types-ragemp-c#master", + "version": "github:kookroach/types-ragemp-c#849cf51f85066c786ad3c563872ae74d9af2dd7c", + "from": "github:kookroach/types-ragemp-c#v1.0", "dev": true }, "@webassemblyjs/ast": { @@ -1681,554 +1681,14 @@ "dev": true }, "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "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", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": 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" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "dev": true, - "optional": 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" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true - } + "nan": "^2.12.1" } }, "get-caller-file": { @@ -2986,9 +2446,9 @@ "dev": true }, "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", "dev": true, "optional": true }, diff --git a/ReallifeGamemode.Client/package.json b/ReallifeGamemode.Client/package.json index c29ea8a8..0c0b26ac 100644 --- a/ReallifeGamemode.Client/package.json +++ b/ReallifeGamemode.Client/package.json @@ -4,7 +4,7 @@ "devDependencies": { "@babel/core": "^7.5.5", "@types/node": "^11.13.18", - "@types/ragemp-c": "github:CocaColaBear/types-ragemp-c#master", + "@types/ragemp-c": "github:kookroach/types-ragemp-c#v1.0", "babel-loader": "^8.0.6", "copy-webpack-plugin": "^5.1.1", "serialize-javascript": "^3.0.0", @@ -22,6 +22,5 @@ "ProjectOpened": [ "watch" ] - }, - "dependencies": {} + } } diff --git a/ReallifeGamemode.Client/util/attachmentMngr.ts b/ReallifeGamemode.Client/util/attachmentMngr.ts index 60ba0235..b3f0a1d9 100644 --- a/ReallifeGamemode.Client/util/attachmentMngr.ts +++ b/ReallifeGamemode.Client/util/attachmentMngr.ts @@ -1,137 +1,68 @@ -import { IGame, EntityType, IEntity } from "../game"; -import relativeVector from "./relativevector"; +import { IGame, IEntity } from "../game"; -var attachId = 0; 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)); - attachmentMngr.register("ammobox", "gr_prop_gr_crate_mag_01a", "PH_L_Hand", new mp.Vector3(0, -0.18, -0.18), new mp.Vector3(0, 0, 0)); + attachmentMngr.register("ammobox", "gr_prop_gr_crate_mag_01a", 28422, new mp.Vector3(0, -0.1, -0.18), new mp.Vector3(0, 0, 90)); attachmentMngr.register("binbag", "prop_cs_rub_binbag_01", 28422, new mp.Vector3(0.08, 0.0, -0.03), new mp.Vector3(270.0, 0.0, 25.0)); 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", "weapondeal2w_sg_pumpshotgun", new mp.Vector3(0.4, 1.6, 0.62), new mp.Vector3(90, 0, 180)); + attachmentMngr.register("weapondeal2", "w_sg_pumpshotgun", "chassis_dummy", new mp.Vector3(0.4, 1.6, 0.62), new mp.Vector3(90, 0, 180)); }); - const attachmentMngr = + + + const attachmentMngr = { attachments: {}, - addFor: function (entityRage, id) { - - if (!entityRage) { - return; - } - - - let entity: IEntity; - if (entityRage.type === "player") { - var player = game.players.at(entityRage.remoteId); - entity = player; - - } else if (entityRage.type === "vehicle") { - var vehicle = game.vehicles.at(entityRage.remoteId); - entity = vehicle; - var realName = mp.game.ui.getLabelText(mp.game.vehicle.getDisplayNameFromVehicleModel(entityRage.model)); - } else if (entityRage.type === "object") { - return; - } - - - - - - let e = game.attachments.get(entity); - + addFor: async function (entity, id) { if (this.attachments.hasOwnProperty(id)) { - - - if (!e.__attachmentObjects) { e.__attachmentObjects = []; } - - - if (!e.__attachmentObjects.hasOwnProperty(id)) { - - + if (!entity.__attachmentObjects) { + entity.__attachmentObjects = {}; + } + if (!entity.__attachmentObjects.hasOwnProperty(id)) { let attInfo = this.attachments[id]; - let rageObject = mp.objects.new(attInfo.model, entityRage.position); - - var bone = (typeof (attInfo.boneName) === 'string') ? entityRage.getBoneIndexByName(attInfo.boneName) : entityRage.getBoneIndex(attInfo.boneName) - - let attachmentData = { - targetEntity: entity.id, - bone: bone, + 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), offset: attInfo.offset, rotation: attInfo.rotation }; - game.objects.setData(rageObject, attachmentData); // hier hakt es mein freund - - let object = game.objects.at(rageObject.remoteId); - - //DEBUG MSG - mp.gui.chat.push(`ATTACH: ${attachId} - bone = ${bone}`) - - //rageObject.notifyStreaming = true; - mp.gui.chat.push("Notified Stream."); - game.wait(200); - - //DEBUG MSG - mp.gui.chat.push(`ATTACH: ${attachId} - Attaching ${JSON.stringify(attInfo)}`); - e.__attachmentObjects[id] = rageObject;; + object.notifyStreaming = true; + entity.__attachmentObjects[id] = object; } } - /* else { - mp.game.graphics.notify(`Static Attachments Error: ~r~Unknown Attachment Used: ~w~0x${id.toString(16)}`); - } */ - }, - - removeFor: function (entityRage, id) { - let entity; - if (entityRage.type === "player") { - entity = game.players.at(entityRage.remoteId); - } else if (entityRage.type === "vehicle") { - entity = game.vehicles.at(entityRage.remoteId); - } - let e = game.attachments.get(entity); - - if (e.__attachmentObjects.hasOwnProperty(id)) { - let obj = e.__attachmentObjects[id]; - - obj.destroy(); - delete e.__attachmentObjects[id]; + else { + mp.game.graphics.notify(`Static Attachments Error: ~r~Unknown Attachment Used: ~w~0x${id.toString(16)}`); } }, - initFor: function (entityRage) { - let entity; - if (entityRage.type === "player") { - entity = game.players.at(entityRage.remoteId); - } else if (entityRage.type === "vehicle") { - entity = game.vehicles.at(entityRage.remoteId); - } + removeFor: function (entity, id) { + if (entity.__attachmentObjects.hasOwnProperty(id)) { + let obj = entity.__attachmentObjects[id]; + delete entity.__attachmentObjects[id]; - let e = game.attachments.get(entity); - if (e != null) { - for (let attachment of e.__attachments) { - attachmentMngr.addFor(entityRage, attachment); + if (mp.objects.exists(obj)) { + obj.destroy(); } } }, - shutdownFor: function (entityRage) { - let entity; - if (entityRage.type === "player") { - entity = game.players.at(entityRage.remoteId); - } else if (entityRage.type === "vehicle") { - entity = game.vehicles.at(entityRage.remoteId); + initFor: function (entity) { + for (let attachment of entity.__attachments) { + attachmentMngr.addFor(entity, attachment); } + }, - let e = game.attachments.get(entity); - if (e != null) { - for (let attachment of e.__attachments) { - attachmentMngr.removeFor(entityRage, attachment); - } + shutdownFor: function (entity) { + for (let attachment in entity.__attachmentObjects) { + attachmentMngr.removeFor(entity, attachment); } }, @@ -147,7 +78,6 @@ export default function attachmentManager(game: IGame) { if (!this.attachments.hasOwnProperty(id)) { if (mp.game.streaming.isModelInCdimage(model)) { this.attachments[id] = - { id: id, model: model, @@ -157,7 +87,7 @@ export default function attachmentManager(game: IGame) { }; } else { - mp.game.graphics.notify(`Static Attachments Error: ~r~Invalid Model(0x${model.toString(16)})`); + mp.game.graphics.notify(`Static Attachments Error: ~r~Invalid Model (0x${model.toString(16)})`); } } else { @@ -180,10 +110,9 @@ export default function attachmentManager(game: IGame) { attachmentName = mp.game.joaat(attachmentName); } - let entity = game.players.local; - let e = game.attachments.get(entity); + let entity = mp.players.local; - if (!e.__attachments || e.__attachments.indexOf(attachmentName) === -1) { + if (!entity.__attachments || entity.__attachments.indexOf(attachmentName) === -1) { mp.events.callRemote("staticAttachments.Add", attachmentName.toString(36)); } }, @@ -193,10 +122,9 @@ export default function attachmentManager(game: IGame) { attachmentName = mp.game.joaat(attachmentName); } - let entity = game.players.local; - let e = game.attachments.get(entity); + let entity = mp.players.local; - if (e.__attachments && e.__attachments.indexOf(attachmentName) !== -1) { + if (entity.__attachments && entity.__attachments.indexOf(attachmentName) !== -1) { mp.events.callRemote("staticAttachments.Remove", attachmentName.toString(36)); } }, @@ -206,160 +134,71 @@ export default function attachmentManager(game: IGame) { } }; - mp.events.add("entityStreamIn", (entityRage) => { - if (entityRage.type === "player" || entityRage.type === "vehicle") { - let entity; + mp.events.add("entityStreamIn", (entity) => { + if (entity.__attMgrData) { + const { targetEntity, bone, offset, rotation } = entity.__attMgrData; - if (entityRage.type === "player") { - entity = game.players.at(entityRage.remoteId); - } else if (entityRage.type === "vehicle") { - entity = game.vehicles.at(entityRage.remoteId); - } + entity.attachTo( + targetEntity, bone, + offset.x, offset.y, offset.z, + rotation.x, rotation.y, rotation.z, + false, false, false, false, 2, true + ); + } - if (entityRage.tye === "object") { //if is object - game.wait(200); - - mp.gui.chat.push("object streamed"); - entity = game.objects.at(entityRage.remoteId); - - game.wait(200); - mp.gui.chat.push("object try get data"); - game.wait(200); - - - const { targetEntity, bone, offset, rotation } = entity.__attachmentData; - game.wait(200); - -+ - mp.gui.chat.push(targetEntity + "," + bone + "," + offset + "," + rotation); - game.wait(200); - - - entity.attachTo( - targetEntity, bone, - offset.x, offset.y, offset.z, - rotation.x, rotation.y, rotation.z, - false, false, false, false, 2, true - ); - - - return; - } - - let e = game.attachments.get(entity); //if player or vehicle - if (e != null) { - if (e.__attachments) { - attachmentMngr.initFor(entityRage); - } - } + if (entity.__attachments) { + attachmentMngr.initFor(entity); } }); - mp.events.add("entityStreamOut", (entityRage) => { - if (entityRage == mp.players.local.vehicle) { - return; - } - if (entityRage.type === "player" || entityRage.type === "vehicle") { - let e = game.attachments.at(entityRage.remoteId); - - if (e != null) { - if (e.__attachmentObjects) { - //game.wait(2500); - attachmentMngr.shutdownFor(entityRage); - } - } + mp.events.add("entityStreamOut", (entity) => { + if (entity.__attachmentObjects) { + attachmentMngr.shutdownFor(entity); } }); - mp.events.addDataHandler("attachmentsData", (entityRage, data) => { - let newAttachments = (data != null) ? data.split('|').map(att => parseInt(att, 36)) : []; + mp.events.addDataHandler("attachmentsData", (entity, data) => { + let newAttachments = (data.length > 0) ? data.split('|').map(att => parseInt(att, 36)) : []; - if (entityRage.handle !== 0) { - let entity; - if (entityRage.type === "player") { - entity = game.players.at(entityRage.remoteId); - } else if (entityRage.type === "vehicle") { - entity = game.vehicles.at(entityRage.remoteId); - } - let e = game.attachments.get(entity); - if (e == null) { - let __attachments = []; - let __attachmentObjects = []; - e = game.attachments.set(entity, __attachments, __attachmentObjects); - } - - let oldAttachments = e.__attachments; + if (entity.handle !== 0) { + let oldAttachments = entity.__attachments; if (!oldAttachments) { oldAttachments = []; - e.__attachmentObjects = []; + entity.__attachmentObjects = {}; } // process outdated first - for (let attachment of oldAttachments.keys()) { - var obj = oldAttachments[attachment]; - if (newAttachments.indexOf(obj) === -1) { - attachmentMngr.removeFor(entityRage, obj); + for (let attachment of oldAttachments) { + if (newAttachments.indexOf(attachment) === -1) { + attachmentMngr.removeFor(entity, attachment); } } // then new attachments for (let attachment of newAttachments) { if (oldAttachments.indexOf(attachment) === -1) { - attachmentMngr.addFor(entityRage, attachment); + attachmentMngr.addFor(entity, attachment); } } - e.__attachments = newAttachments; } + + entity.__attachments = newAttachments; }); function InitAttachmentsOnJoin() { - game.players.forEach(_player => { - let player = mp.players.at(_player.remoteId); - - if (!player) { - return; - } - - let e = game.attachments.get(_player); - if (e == null) { - let __attachments = []; - let __attachmentObjects = []; - e = game.attachments.set(_player, __attachments, __attachmentObjects); - } - let data = player.getVariable("attachmentsData"); + mp.players.forEach(_player => { + let data = _player.getVariable("attachmentsData"); if (data && data.length > 0) { let atts = data.split('|').map(att => parseInt(att, 36)); - e.__attachments = atts; - e.__attachmentObjects = []; + _player.__attachments = atts; + _player.__attachmentObjects = {}; } }); - /* - game.vehicles.forEach(_veh => { - let vehicle = mp.vehicles.at(_veh.remoteId); - - if (!vehicle) { - return; - } - - let e = game.attachments.get(_veh); - if (e == null) { - let __attachments = []; - let __attachmentObjects = []; - e = game.attachments.set(_veh, __attachments, __attachmentObjects); - } - let data = vehicle.getVariable("attachmentsData"); - - if (data && data.length > 0) { - let atts = data.split('|').map(att => parseInt(att, 36)); - e.__attachments = atts; - e.__attachmentObjects = []; - } - }); - */ } - mp.events.add("playerReady", () => { //player finished doenloading assets from server. + + mp.events.add("playerReady", () => { InitAttachmentsOnJoin(); }); } \ No newline at end of file diff --git a/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts b/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts index 2cd88c2e..351b723e 100644 --- a/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts +++ b/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts @@ -10,9 +10,9 @@ game.events.add('SERVER:Vehicle:UpdateData', (vehId, dataStr) => { setVehicleData(vehicle, data); }); -game.events.onPlayerEnterVehicle((vehicle, seat) => { +game.events.onPlayerEnterVehicle(async (vehicle, seat) => { while (!game.players.local.inVehicle) { - game.wait(0); + await game.wait(0); } if (vehicle) { @@ -22,11 +22,11 @@ game.events.onPlayerEnterVehicle((vehicle, seat) => { } }); -game.events.onPlayerExitVehicle(() => { +game.events.onPlayerExitVehicle(async () => { var veh = game.players.local.vehicle; while (game.players.local.inVehicle) { - game.wait(0); + await game.wait(0); } if (veh) { diff --git a/ReallifeGamemode.Database/Entities/User.cs b/ReallifeGamemode.Database/Entities/User.cs index b64fa754..c4b76095 100644 --- a/ReallifeGamemode.Database/Entities/User.cs +++ b/ReallifeGamemode.Database/Entities/User.cs @@ -120,7 +120,6 @@ namespace ReallifeGamemode.Database.Entities public bool WeaponLicense { get; set; } = false; - public bool IsAdmin(AdminLevel level) => AdminLevel >= level; public int Points { get; set; } public int otheramount { get; set; } = 0; diff --git a/ReallifeGamemode.Server.Core/Commands/Command.cs b/ReallifeGamemode.Server.Core/Commands/Command.cs index 92966605..ecb91b54 100644 --- a/ReallifeGamemode.Server.Core/Commands/Command.cs +++ b/ReallifeGamemode.Server.Core/Commands/Command.cs @@ -23,6 +23,6 @@ namespace ReallifeGamemode.Server.Core.Commands Log = LogManager.GetLogger(this.GetType()); } - protected DatabaseContext GetDbContext(bool useLoggerFactory = true) => Main.GetDbContext(useLoggerFactory); + protected DatabaseContext GetDbContext(bool useLoggerFactory = false) => Main.GetDbContext(useLoggerFactory); } } diff --git a/ReallifeGamemode.Server.Core/Main.cs b/ReallifeGamemode.Server.Core/Main.cs index 128b4d58..bceec473 100644 --- a/ReallifeGamemode.Server.Core/Main.cs +++ b/ReallifeGamemode.Server.Core/Main.cs @@ -64,7 +64,7 @@ namespace ReallifeGamemode.Server.Core } } - public static DatabaseContext GetDbContext(bool useLoggerFactory = true) + public static DatabaseContext GetDbContext(bool useLoggerFactory = false) { return new DatabaseContext(useLoggerFactory); } diff --git a/ReallifeGamemode.Server.Core/Menus/PoliceDepartment.cs b/ReallifeGamemode.Server.Core/Menus/PoliceDepartment.cs index 5ab97028..65aa993f 100644 --- a/ReallifeGamemode.Server.Core/Menus/PoliceDepartment.cs +++ b/ReallifeGamemode.Server.Core/Menus/PoliceDepartment.cs @@ -4,7 +4,8 @@ using System.Text; using ReallifeGamemode.Server.Core.API; using ReallifeGamemode.Server.Types; using ReallifeGamemode.Server.Core.Extensions; - +using Microsoft.EntityFrameworkCore; +using System.Linq; namespace ReallifeGamemode.Server.Core.Menus { @@ -49,6 +50,9 @@ namespace ReallifeGamemode.Server.Core.Menus player.SendMessage("Du hast den Waffenschein erfolgreich erworben.", ChatPrefix.Info); + dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 1).First().BankAccount.Balance += 1000; + dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 3).First().BankAccount.Balance += 1000; + user.WeaponLicense = true; dbContext.SaveChanges(); } diff --git a/ReallifeGamemode.Server.Core/Script.cs b/ReallifeGamemode.Server.Core/Script.cs index 5d87f5d2..c3474a38 100644 --- a/ReallifeGamemode.Server.Core/Script.cs +++ b/ReallifeGamemode.Server.Core/Script.cs @@ -21,6 +21,6 @@ namespace ReallifeGamemode.Server.Core Log = LogManager.GetLogger(GetType()); } - protected DatabaseContext GetDbContext(bool useLoggerFactory = true) => Main.GetDbContext(useLoggerFactory); + protected DatabaseContext GetDbContext(bool useLoggerFactory = false) => Main.GetDbContext(useLoggerFactory); } } diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index fd583aff..2979765b 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -290,6 +290,7 @@ namespace ReallifeGamemode.Server.Commands { player.SetData("SAdminduty", true); player.SetSharedData("blipColor", 30); + player.SetSharedData("nameTagColor", -2); ChatService.SendMessage(player, "~g~ ** " + "Du befindest dich im T-Support"); } else @@ -304,23 +305,32 @@ namespace ReallifeGamemode.Server.Commands { case null: player.SetSharedData("blipColor", 0); + player.SetSharedData("nameTagColor", 0); + break; + case 0: + player.SetSharedData("blipColor", 0); + player.SetSharedData("nameTagColor", 0); break; - case 8: player.SetSharedData("blipColor", 83); + player.SetSharedData("nameTagColor", 8); break; case 7: player.SetSharedData("blipColor", 52); + player.SetSharedData("nameTagColor", 7); break; case 4: player.SetSharedData("blipColor", 5); + player.SetSharedData("nameTagColor", 4); break; case 9: player.SetSharedData("blipColor", 25); + player.SetSharedData("nameTagColor", 9); break; } + player.SetSharedData("nameTagColor", targetUser.FactionId); } } @@ -1487,25 +1497,32 @@ namespace ReallifeGamemode.Server.Commands { case null: target.SetSharedData("blipColor", 0); + target.SetSharedData("nameTagColor", 0); + break; + case 0: + target.SetSharedData("blipColor", 0); + target.SetSharedData("nameTagColor", 0); break; - case 8: target.SetSharedData("blipColor", 83); + target.SetSharedData("nameTagColor", 8); break; case 7: target.SetSharedData("blipColor", 52); + target.SetSharedData("nameTagColor", 7); break; case 4: target.SetSharedData("blipColor", 5); + target.SetSharedData("nameTagColor", 4); break; case 9: target.SetSharedData("blipColor", 25); + target.SetSharedData("nameTagColor", 9); break; } target.TriggerEvent("jailTime", 0); - targetUser.Wanteds = 0; dbContext.SaveChanges(); } @@ -1726,6 +1743,39 @@ namespace ReallifeGamemode.Server.Commands #endregion Admin #region ALevel1337 + /*NUR ZUM TESTEN + [Command("fakedeath", "~m~Benutzung:~s~ /fakedeath")] + public void CmdAdmFakeDeath(Player player) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.PROJEKTLEITUNG) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + MedicTask reviveTask = new MedicTask() + { + Victim = player.Name, + Position = player.Position, + CauseOfDeath = "FAKE", + Caller = null, + Description = "Gestorben", + Time = DateTime.Now, + Type = MedicTaskType.REVIVE, + MedicName = "none" + }; + Medic.AddTaskToList(reviveTask); + }*/ + + [Command("setblipcolor", "~m~Benutzung:~s~ /setblipcolor [ID]")] + public void CmdAdmSetBlipColor(Player player, int blipId) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.PROJEKTLEITUNG) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + player.SetSharedData("blipColor", blipId); + } [Command("setsvar", "~m~Benutzung:~s~ /setsvar [ID] [WERT]")] public void CmdAdmSetSvar(Player player, int varId, int varValue) @@ -1986,6 +2036,30 @@ namespace ReallifeGamemode.Server.Commands ChatService.SendMessage(player, "~b~Das Leben von " + peopleInRange.Count + " Spielern wurde auf " + hp + " gesetzt."); } + [Command("rsetwage", "~m~Benutzung: ~s~/rsetwage [Radius] (Verdienst)")] + public void CmdAdminRangeSetWage(Player player, float radius, int wage) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + var peopleInRange = NAPI.Player.GetPlayersInRadiusOfPlayer(radius, player); + + using (var dbContext = new DatabaseContext()) + { + foreach (var managedPlayer in peopleInRange) + { + 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(); + } + } + ChatService.SendMessage(player, "~b~Der Verdienst von " + peopleInRange.Count + " Spielern wurde um $" + wage + " erhöht."); + } + [Command("setweather", "~m~Benutzung: ~s~/setweather [Wetter]")] public void CmdAdminSetweather(Player player, string weather) { @@ -2419,21 +2493,32 @@ namespace ReallifeGamemode.Server.Commands { case null: target.SetSharedData("blipColor", 0); + target.SetSharedData("nameTagColor", 0); + break; + + case 0: + target.SetSharedData("blipColor", 0); + target.SetSharedData("nameTagColor", 0); break; case 8: target.SetSharedData("blipColor", 83); + target.SetSharedData("nameTagColor", 8); break; case 7: target.SetSharedData("blipColor", 52); + target.SetSharedData("nameTagColor", 7); break; case 4: target.SetSharedData("blipColor", 5); + target.SetSharedData("nameTagColor", 4); break; case 9: target.SetSharedData("blipColor", 25); + target.SetSharedData("nameTagColor", 9); + break; } dbContext.SaveChanges(); @@ -2482,24 +2567,32 @@ namespace ReallifeGamemode.Server.Commands { case null: target.SetSharedData("blipColor", 0); + target.SetSharedData("nameTagColor", 0); + break; + case 0: + target.SetSharedData("blipColor", 0); + target.SetSharedData("nameTagColor", 0); break; case 8: target.SetSharedData("blipColor", 83); + target.SetSharedData("nameTagColor", 8); break; case 7: target.SetSharedData("blipColor", 52); + target.SetSharedData("nameTagColor", 7); break; case 4: target.SetSharedData("blipColor", 5); + target.SetSharedData("nameTagColor", 4); break; case 9: target.SetSharedData("blipColor", 25); + target.SetSharedData("nameTagColor", 9); break; } - dbContext.SaveChanges(); } } @@ -3364,7 +3457,7 @@ namespace ReallifeGamemode.Server.Commands using (var dbContext = new DatabaseContext()) { - target.GetUser(dbContext).Wage = wage; + target.GetUser(dbContext).Wage += wage; dbContext.SaveChanges(); } } diff --git a/ReallifeGamemode.Server/Commands/FactionCommands.cs b/ReallifeGamemode.Server/Commands/FactionCommands.cs index dffffd3d..8cebc338 100644 --- a/ReallifeGamemode.Server/Commands/FactionCommands.cs +++ b/ReallifeGamemode.Server/Commands/FactionCommands.cs @@ -51,11 +51,22 @@ namespace ReallifeGamemode.Server.Commands ChatService.NotAuthorized(player); return; } - if (f.Name == "Ballas" || f.Name == "Grove" || user.IsAdmin(AdminLevel.ADMIN)) + if (f?.Name == "Ballas" || f?.Name == "Grove" || user.IsAdmin(AdminLevel.ADMIN)) { message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); - string broadcastMessage = "!{FF0000}** " + player.GetUser().GetFactionRank().RankName + " " + player.Name + ": " + message + " **"; + string rank = string.Empty; + + if(f?.Name == "Ballas" || f?.Name == "Grove") + { + rank = player.GetUser().GetFactionRank().RankName; + } + else + { + rank = "[ADMIN]"; + } + + string broadcastMessage = "!{FF0000}** " + rank + " " + player.Name + ": " + message + " **"; using (var context = new DatabaseContext()) { ChatService.BroadcastFaction(broadcastMessage, context.Factions.ToList().FindAll(c => c.GangOwned), true); @@ -86,8 +97,9 @@ namespace ReallifeGamemode.Server.Commands [Command("d", "~m~Benutzung: ~s~/d [Nachricht]", GreedyArg = true)] public void CmdFactionD(Player player, string message) { + User u = player.GetUser(); Faction f = player.GetUser()?.Faction; - if (f == null || !f.StateOwned) + if ((f == null || !f.StateOwned) && !u.IsAdmin(AdminLevel.ADMIN)) { ChatService.NotAuthorized(player); return; @@ -95,10 +107,21 @@ namespace ReallifeGamemode.Server.Commands message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); - string broadcastMessage = "!{CC3333}** " + player.GetUser().GetFactionRank().RankName + " " + player.Name + ": " + message + ", over **"; + string factionName = string.Empty; + + if(f.StateOwned) + { + factionName = player.GetUser().GetFactionRank().RankName; + } + else + { + factionName = "[ADMIN]"; + } + + string broadcastMessage = "!{CC3333}** " + factionName + " " + player.Name + ": " + message + ", over **"; using (var context = new DatabaseContext()) { - ChatService.BroadcastFaction(broadcastMessage, context.Factions.ToList().FindAll(c => c.StateOwned)); + ChatService.BroadcastFaction(broadcastMessage, context.Factions.ToList().FindAll(c => c.StateOwned), true); } } @@ -188,12 +211,25 @@ namespace ReallifeGamemode.Server.Commands message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); - string broadcastMsg = "~y~[" + player.GetUser().Faction.Name + "] " + player.Name + ": " + message; + string factionName = string.Empty; + if(user.FactionLeader) + { + factionName = player.GetUser().Faction.Name; + } + else + { + factionName = "ADMIN"; + } + + string broadcastMsg = "~y~[" + factionName + "] " + player.Name + ": " + message; NAPI.Pools.GetAllPlayers().ForEach(p => { User pUser = p.GetUser(); - if (pUser?.FactionLeader ?? false || pUser.IsAdmin(AdminLevel.ADMIN)) ChatService.SendMessage(p, broadcastMsg); + if (pUser.FactionLeader || pUser.IsAdmin(AdminLevel.ADMIN)) + { + ChatService.SendMessage(p, broadcastMsg); + } }); } @@ -261,7 +297,7 @@ namespace ReallifeGamemode.Server.Commands } using var dbContext = new DatabaseContext(); - var nearPlayers = NAPI.Player.GetPlayersInRadiusOfPlayer(2, player); + var nearPlayers = NAPI.Player.GetPlayersInRadiusOfPlayer(4, player); var deadPlayer = nearPlayers.Where(i => i.GetData("isDead") == true).FirstOrDefault(); if (player == deadPlayer) { @@ -461,23 +497,36 @@ namespace ReallifeGamemode.Server.Commands target.SetSharedData("blipColor", 0); switch (targetUser.FactionId) { + case null: + target.SetSharedData("blipColor", 0); + target.SetSharedData("nameTagColor", 0); + break; + + case 0: + target.SetSharedData("blipColor", 0); + target.SetSharedData("nameTagColor", 0); + break; + case 8: target.SetSharedData("blipColor", 83); + target.SetSharedData("nameTagColor", 8); break; case 7: target.SetSharedData("blipColor", 52); + target.SetSharedData("nameTagColor", 7); break; case 4: target.SetSharedData("blipColor", 5); + target.SetSharedData("nameTagColor", 4); break; case 9: target.SetSharedData("blipColor", 25); + target.SetSharedData("nameTagColor", 9); break; } target.TriggerEvent("jailTime", 0); - targetUser.Wanteds = 0; dbContext.SaveChanges(); } diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 47008c2e..b70039f2 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -151,7 +151,9 @@ namespace ReallifeGamemode.Server.Events licenses, vehicles, factionVehicles, - nextPayday = u.PaydayTimer + nextPayday = u.PaydayTimer, + playTime = u.PlayedMinutes / 60, + userWarn = u.warn, }; string faction = u.Faction?.Name ?? "Zivilist"; @@ -199,7 +201,7 @@ namespace ReallifeGamemode.Server.Events DutyPoint nearestDuty = PositionManager.DutyPoints.Find(d => d.Position.DistanceTo(player.Position) <= 1.5 && d.FactionId == user.FactionId); WeaponPoint nearestWeapon = PositionManager.WeaponPoints.Find(w => w.Position.DistanceTo(player.Position) <= 1.5 && w.FactionId == user.FactionId); JailReleasePoint nearestJailReleasePoint = PositionManager.JailReleasePoints.Find(j => j.Position.DistanceTo(player.Position) <= 1.5 && (user.FactionId == 1 || user.FactionId == 3) && user.GetData("duty")); - ElevatorPoint nearestElevatorPoint = PositionManager.ElevatorPoints.Find(e => e.Position.DistanceTo(player.Position) <= 1.5 && (user.FactionId == 1 || user.FactionId == 3)); + ElevatorPoint nearestElevatorPoint = PositionManager.ElevatorPoints.Find(e => e.Position.DistanceTo(player.Position) <= 1.5 && (user.FactionId == 1 || user.FactionId == 2 || user.FactionId == 3)); ClotheshopPoint nearestClotheShopPoint = PositionManager.clotheshopPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.5 && (!user.GetData("duty"))); 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); @@ -216,8 +218,16 @@ 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")) + { + vehicle.AddAttachment("weapondeal", true); + vehicle.AddAttachment("weapondeal1", true); + vehicle.AddAttachment("weapondeal2", true); + } + if (WeaponDealManager.checkWeaponDbyVehicle(vehicle)) { vehicle.ResetData("WeaponDealLoad"); @@ -262,7 +272,6 @@ namespace ReallifeGamemode.Server.Events } if (nearestDuty != null)// Duty Point { - var nameTagColor = new Color(0, 0, 0); var factionId = user.FactionId; if (user.GetData("duty") == false) @@ -280,7 +289,7 @@ namespace ReallifeGamemode.Server.Events case 1: //nameTagColor = new Color(28, 134, 238); //player.TriggerEvent("setNameTag", JsonConvert.SerializeObject(new int[] { 28, 134, 238 })); - //player.SetSharedData("nameTagColor", JsonConvert.SerializeObject(new int[] { 28, 134, 238})); + player.SetSharedData("nameTagColor", factionId); player.SetSharedData("blipColor", 38); break; @@ -288,15 +297,15 @@ namespace ReallifeGamemode.Server.Events case 2: //nameTagColor = new Color(255, 0, 0); //player.TriggerEvent("setNameTag", JsonConvert.SerializeObject(new int[] { 255, 0, 0 })); - //player.SetSharedData("nameTagColor", new int[] { 255, 0, 0}); - player.SetSharedData("blipColor", 79); + player.SetSharedData("nameTagColor", factionId); + player.SetSharedData("blipColor", 6); break; //FBI case 3: //nameTagColor = new Color(173, 0, 118); - //player.SetSharedData("nameTagColor", new int[] { 173, 0, 118}); - player.SetSharedData("blipColor", 72); + player.SetSharedData("nameTagColor", factionId); + player.SetSharedData("blipColor", 63); player.SetAccessories(2, 2, 0); break; } @@ -331,7 +340,7 @@ namespace ReallifeGamemode.Server.Events player.TriggerEvent("toggleDutyMode", false); Medic.UpdateDutyMedics(-1); player.SetSharedData("blipColor", 0); - //player.SetSharedData("nameTagColor", new Color[255, 255, 255, 255]); + player.SetSharedData("nameTagColor", 0); UpdateCharacterCloth.LoadCharacterDefaults(player); } } @@ -364,13 +373,11 @@ namespace ReallifeGamemode.Server.Events using (var context = new DatabaseContext()) { - /* if (player.HasAttachment("ammobox")) { player.AddAttachment("ammobox", true); player.StopAnimation(); } - */ bool unloadedWeaponPackage = false; List fItem = context.UserItems.Where(u => u.UserId == user.Id).ToList(); @@ -553,7 +560,8 @@ 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) + } + else if (nearestJobPoint.jobId == 3 && player.GetUser().JobId == 3) { if (nearestJobPoint.Skill < 300 && player.GetUser().PilotSkill >= 0) { @@ -571,11 +579,6 @@ namespace ReallifeGamemode.Server.Events return; } } - else - { - player.SendChatMessage("~y~[JOB] ~r~Dein Skilllevel ist noch zu niedrig."); - return; - } if (nearestJobPoint.Skill >= 300 && player.GetUser().PilotSkill >= 300) { if (job.GetUsersInJob().Contains(player)) @@ -591,8 +594,7 @@ namespace ReallifeGamemode.Server.Events player.TriggerEvent("renderTextOnScreen", "Steige nun in eines der Flugzeuge und starte den Motor mit der Taste 'N'."); return; } - } - else + } { player.SendChatMessage("~y~[JOB] ~r~Dein Skilllevel ist noch zu niedrig."); return; diff --git a/ReallifeGamemode.Server/Events/Login.cs b/ReallifeGamemode.Server/Events/Login.cs index 4667db80..b89e2269 100644 --- a/ReallifeGamemode.Server/Events/Login.cs +++ b/ReallifeGamemode.Server/Events/Login.cs @@ -104,34 +104,38 @@ namespace ReallifeGamemode.Server.Events { case null: player.SetSharedData("blipColor", 0); - //player.SetSharedData("nameTagColor", new int[] { 255, 255, 255 }); + player.SetSharedData("nameTagColor", 0); break; case 0: player.SetSharedData("blipColor", 0); - //player.SetSharedData("nameTagColor", new int[] { 255, 255, 255 }); + player.SetSharedData("nameTagColor", 0); break; case 8: player.SetSharedData("blipColor", 83); - //player.SetSharedData("nameTagColor", new int[]{171, 0, 207}); + player.SetSharedData("nameTagColor", 8); break; case 7: player.SetSharedData("blipColor", 52); - //player.SetSharedData("nameTagColor", new int[] { 0, 54, 0}); + player.SetSharedData("nameTagColor", 7); break; case 4: player.SetSharedData("blipColor", 5); + player.SetSharedData("nameTagColor", 4); break; case 9: player.SetSharedData("blipColor", 25); - //player.SetSharedData("nameTagColor", new int[] { 0, 166, 133}); + player.SetSharedData("nameTagColor", 9); + break; + default: + player.SetSharedData("blipColor", 0); + player.SetSharedData("nameTagColor", 0); break; } - - + if (user.CharacterId == null) { diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index 6b04c579..765d3f05 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -7,6 +7,7 @@ using Newtonsoft.Json; using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Services; +using ReallifeGamemode.Server.Types; /** * @overview Life of German Reallife - Player Extension (PlayerExtension.cs) @@ -93,7 +94,7 @@ namespace ReallifeGamemode.Server.Extensions internal static T GetData(this User user, string key, T nullValue) { - if(user == null) + if (user == null) { return default; } @@ -107,7 +108,7 @@ namespace ReallifeGamemode.Server.Extensions internal static void SetData(this User user, string key, object value) { - if(user == null) + if (user == null) { return; } @@ -130,6 +131,7 @@ namespace ReallifeGamemode.Server.Extensions dbUser.Wanteds = newWanteds; dbContext.SaveChanges(); } + user.Player.SetSharedData("nameTagColor", -1); user.Player.SetSharedData("blipColor", 64); ChatService.SendMessage(user.Player, "!{#FF614A}Du hast ein Verbrechen begangen: " + reason + "" + (cop != null ? " | Gemeldet von: " + cop.Name + "." : "")); ChatService.SendMessage(user.Player, " !{#FFFF00}Fahnundgslevel:~s~ " + newWanteds); @@ -232,5 +234,14 @@ namespace ReallifeGamemode.Server.Extensions return dbContext.UserItems.Where(u => u.UserId == user.Id).ToList(); } } + + public static bool IsAdmin(this User user, AdminLevel adminLevel) + { + if(user == null) + { + return false; + } + return user.AdminLevel >= adminLevel; + } } } diff --git a/ReallifeGamemode.Server/Factions/Medic/Medic.cs b/ReallifeGamemode.Server/Factions/Medic/Medic.cs index 60442169..a9acc028 100644 --- a/ReallifeGamemode.Server/Factions/Medic/Medic.cs +++ b/ReallifeGamemode.Server/Factions/Medic/Medic.cs @@ -24,6 +24,7 @@ namespace ReallifeGamemode.Server.Factions.Medic public static List FireTasks = new List(); public static int ReviveIncome = 100; public static int dutyMedics = 0; + public static int reviveTaskTime = 240; public static void AddTaskToList(MedicTask task) { @@ -71,27 +72,39 @@ namespace ReallifeGamemode.Server.Factions.Medic } } + public static void UpdateTaskTimeLeft() + { + DateTime actualTime = DateTime.Now; + if (ReviveTasks.Count != 0) + { + foreach (var task in ReviveTasks) + { + if (task.MedicName != null) + { + var taskTimeLeft = Math.Abs((Int32)(((DateTimeOffset)actualTime).ToUnixTimeSeconds() - ((DateTimeOffset)task.Time).ToUnixTimeSeconds() - reviveTaskTime)); + task.TimeLeft = taskTimeLeft; + var medic = PlayerService.GetPlayerByNameOrId(task.MedicName); + if(task.MedicName != "none") medic.TriggerEvent("setTaskTimeLeft", taskTimeLeft); + } + } + } + } + [RemoteEvent("loadMedicTasks")] public void LoadMedicTasks(Player player, int type) { switch (type) { case 0: - List deathTimes = new List(); - foreach(var task in ReviveTasks) - { - deathTimes.Add(((DateTimeOffset)task.Time).ToUnixTimeSeconds()); - } - - player.TriggerEvent("showMedicTasks", 0, JsonConvert.SerializeObject(ReviveTasks), JsonConvert.SerializeObject(deathTimes)); + player.TriggerEvent("showMedicTasks", 0, JsonConvert.SerializeObject(ReviveTasks)); break; case 1: - player.TriggerEvent("showMedicTasks", 1, JsonConvert.SerializeObject(HealTasks), null); + player.TriggerEvent("showMedicTasks", 1, JsonConvert.SerializeObject(HealTasks)); break; case 2: - player.TriggerEvent("showMedicTasks", 2, JsonConvert.SerializeObject(FireTasks), null); + player.TriggerEvent("showMedicTasks", 2, JsonConvert.SerializeObject(FireTasks)); break; } } @@ -161,11 +174,13 @@ namespace ReallifeGamemode.Server.Factions.Medic [RemoteEvent("PayCutMedicEarnings")] public void PayCutMedicEarnings(Player player) { - using var dbContext = new DatabaseContext(); + 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."); Medic.delReviveTaskMedic(player); dbContext.SaveChanges(); + } } [RemoteEvent("MedicTaskTimeout")] @@ -174,6 +189,17 @@ namespace ReallifeGamemode.Server.Factions.Medic Medic.delReviveTaskMedic(player); } + [RemoteEvent("getTaskTimeLeft")] + public void GetTaskTimeLeft(Player player, string victimName) + { + using var dbContext = new DatabaseContext(); + { + var activeTaskTime = ReviveTasks.FirstOrDefault(t => t.MedicName == player.Name && t.Victim == victimName).TimeLeft; + + player.TriggerEvent("setTaskTimeLeft", activeTaskTime); + } + } + public static void UpdateDutyMedics(int modifier) { dutyMedics = dutyMedics + modifier; diff --git a/ReallifeGamemode.Server/Factions/Medic/MedicTask.cs b/ReallifeGamemode.Server/Factions/Medic/MedicTask.cs index 50c0f2a8..9a6ae7f6 100644 --- a/ReallifeGamemode.Server/Factions/Medic/MedicTask.cs +++ b/ReallifeGamemode.Server/Factions/Medic/MedicTask.cs @@ -18,6 +18,7 @@ namespace ReallifeGamemode.Server.Factions.Medic public string Description { get; set; } public string Caller { get; set; } public DateTime Time { get; set; } + public int TimeLeft { get; set; } public string MedicName { get; set; } } diff --git a/ReallifeGamemode.Server/Finance/Economy.cs b/ReallifeGamemode.Server/Finance/Economy.cs index 4ab8214d..4c551892 100644 --- a/ReallifeGamemode.Server/Finance/Economy.cs +++ b/ReallifeGamemode.Server/Finance/Economy.cs @@ -24,7 +24,7 @@ namespace ReallifeGamemode.Server.Finance public static (int, float, float) GetEconomyClass(Player client, int wage) { int bankAccount = client.GetUser().BankAccount.Balance; - float financialHelp = -(float)Math.Pow(1.0005, -(bankAccount + client.GetUser().Handmoney)) * -1000; + float financialHelp = -(float)Math.Pow(1.0001, -(bankAccount + client.GetUser().Handmoney)) * -1000; float financialInterest = 1 - (float)Math.Pow(1.00006, -wage) * 1; if (financialInterest >= 0.7) financialInterest = 0.7f; diff --git a/ReallifeGamemode.Server/Inventory/GroundItem.cs b/ReallifeGamemode.Server/Inventory/GroundItem.cs index 2737d5fc..25f8dcb6 100644 --- a/ReallifeGamemode.Server/Inventory/GroundItem.cs +++ b/ReallifeGamemode.Server/Inventory/GroundItem.cs @@ -102,7 +102,7 @@ namespace ReallifeGamemode.Server.Inventory if (!player.HasAttachment("ammobox")) { player.PlayAnimation("anim@heists@box_carry@", "idle", 49); - //player.AddAttachment("ammobox", false); + player.AddAttachment("ammobox", false); NAPI.Player.SetPlayerCurrentWeapon(player, WeaponHash.Unarmed); } } diff --git a/ReallifeGamemode.Server/Job/BusDriverJob.cs b/ReallifeGamemode.Server/Job/BusDriverJob.cs index 7587bf04..617978c3 100644 --- a/ReallifeGamemode.Server/Job/BusDriverJob.cs +++ b/ReallifeGamemode.Server/Job/BusDriverJob.cs @@ -100,7 +100,6 @@ namespace ReallifeGamemode.Server.Job }.AsReadOnly(); private readonly IReadOnlyCollection Skill2Route2 = new List//Bus_Skill_2_Route_2 { - new Vector3(1925.767333984375, 2614.566162109375, 46.16560363769531), new Vector3(299.0667419433594, 2642.93798828125, 44.60177993774414), new Vector3(1162.4556884765625, 1806.3663330078125, 74.3133773803711), @@ -111,13 +110,26 @@ namespace ReallifeGamemode.Server.Job }.AsReadOnly(); private readonly IReadOnlyCollection Skill2Route3 = new List//Bus_Skill_2_Route_3 { - - new Vector3(-562.68, -2203.85, 5.5), + new Vector3(-1855.54,153.604,79.0297), + new Vector3(-1538.72,1375.19,124.3), + new Vector3(-1101.74,2668.48,17.7363), + new Vector3(1964.14,3718.04,31.2255), + new Vector3(2566.1,396.879,107.463), + new Vector3(254.405,-982.937,28.274), + new Vector3(-562.68, -2203.85, 4.5), }.AsReadOnly(); private readonly IReadOnlyCollection Skill2Route4 = new List//Bus_Skill_2_Route_4 { + new Vector3(-1037.8,-2716.02,12.7963), + new Vector3(1662.69,4849.72,40.9165), + new Vector3(57.8575,3735.46,38.7301), + new Vector3(-1109.48,2681,17.8602), + new Vector3(-2536.35,2322.65,32.0599), + new Vector3(-3232.01,961.997,12.1515), + new Vector3(-3014.22,364.543,13.7242), + new Vector3(-1580.52,-652.24,28.5874), + new Vector3(-578.954,-2224.8,4.75774), - new Vector3(-562.68, -2203.85, 5.5), }.AsReadOnly(); private readonly IReadOnlyCollection Skill3Route1 = new List//Bus_Skill_3_Route_1 { @@ -159,8 +171,16 @@ namespace ReallifeGamemode.Server.Job }.AsReadOnly(); private readonly IReadOnlyCollection Skill3Route3 = new List//Bus_Skill_3_Route_3 { - - new Vector3(-562.68, -2203.85, 5.5), + new Vector3(-146.62071, -2178.8228, 9.194298), + new Vector3(14.580393, -1578.6385, 28.212185), + new Vector3(222.91612, -1098.8556, 28.227453), + new Vector3(246.44946, -648.45496, 38.420746), + new Vector3(102.181, -298.95276, 45.04399), + new Vector3(-104.91002, -606.26013, 35.06103), + new Vector3(-288.1007, -1204.5107, 23.403156), + new Vector3(-166.23526, -1574.4166, 34.152023), + new Vector3(-60.337997, -1976.121, 15.486664), + new Vector3(-599.1891, -2049.2695, 5.14637), }.AsReadOnly(); private readonly IReadOnlyCollection Skill3Route4 = new List//Bus_Skill_3_Route_4 { @@ -302,7 +322,7 @@ namespace ReallifeGamemode.Server.Job if ((VehicleHash)veh.Model == VehicleHash.Coach) { Random rnd = new Random(); - int rroute = rnd.Next(1, 3); + int rroute = rnd.Next(1, 5); switch (rroute) { case 1: @@ -340,7 +360,7 @@ namespace ReallifeGamemode.Server.Job if ((VehicleHash)veh.Model == VehicleHash.Tourbus) { Random rnd = new Random(); - int rroute = rnd.Next(1, 3); + int rroute = rnd.Next(1, 4); switch (rroute) { case 1: diff --git a/ReallifeGamemode.Server/Job/RefuseCollectorJob.cs b/ReallifeGamemode.Server/Job/RefuseCollectorJob.cs index 7a2aab4a..252e5d36 100644 --- a/ReallifeGamemode.Server/Job/RefuseCollectorJob.cs +++ b/ReallifeGamemode.Server/Job/RefuseCollectorJob.cs @@ -19,6 +19,8 @@ namespace ReallifeGamemode.Server.Job public override bool NeedVehicleToStart => false; + const int MAX_BAG = 40; + public RefuseCollectorJob() { JobStart += RefuseCollectorJobJobStart; @@ -168,7 +170,7 @@ namespace ReallifeGamemode.Server.Job if (data.getDataFromClient(player) == null) continue; veh = data.vehicle; JobBase job = JobManager.GetJob(player.GetUser().JobId ?? -1); - ChatService.SendMessage((Player)player, $"~y~Job: ~s~Du hast deinen Job (~o~{job.Name}~s~) gestartet."); + ChatService.SendMessage((Player)player, $"~y~[Job] ~s~Du hast deinen Job (~o~{job.Name}~s~) gestartet."); player.TriggerEvent("SERVER:MuellmannStatusTrue"); player.TriggerEvent("SERVER:MuellmannBCSErstellen", JsonConvert.SerializeObject(vector3s.ToArray()), veh); return; @@ -179,7 +181,6 @@ namespace ReallifeGamemode.Server.Job public void MuellmannJobBeenden(Player player) { JobBase job = JobManager.GetJob(player.GetUser().JobId ?? -1); - ChatService.SendMessage((Player)player, $"~y~Job: ~s~Du hast deinen Job (~o~{job.Name}~s~) beendet."); player.TriggerEvent("SERVER:MuellmannStatusFalse"); player.TriggerEvent("SERVER:MuellmannBCSEntfernen"); @@ -189,11 +190,19 @@ namespace ReallifeGamemode.Server.Job if (data.hasFreePlace()) { + if(data.vehicle != null) + data.vehicle.GetServerVehicle().Spawn(data.vehicle); muellmanData.Remove(data); - //müllwagen respawnen return; } + if (player.HasAttachment("binbag")) + { + player.AddAttachment("binbag", true); + } + + ChatService.SendMessage(data.getPartnerClient(player), $"~y~[Job] ~s~Dein Partner hat den Job beendet."); + data.removeClientFromData(player); return; } @@ -208,7 +217,7 @@ namespace ReallifeGamemode.Server.Job Player target = data.getPartnerClient(player); if (target != null) target.TriggerEvent("MuellmannUpdateColshape", colshapeIndex); player.TriggerEvent("renderTextOnScreen", "Wirf den Müllsack in den Müllwagen."); - //player.AddAttachment("binbag", false); + player.AddAttachment("binbag", false); return; } } @@ -220,95 +229,57 @@ namespace ReallifeGamemode.Server.Job { return; } - using (var dbContext = new DatabaseContext()) + + using var dbContext = new DatabaseContext(); + + foreach (var data in muellmanData) { - foreach (var data in muellmanData) + if (data.getDataFromClient(player) == null) continue; + Player target = data.getPartnerClient(player); + User user1 = player.GetUser(dbContext); + User user2 = target.GetUser(dbContext); + + data.setTrashCount(data.getTrashCount() + 1); + player.SendNotification("Müllsack: " + data.getTrashCount() + " von " + MAX_BAG + "."); + if (target != null) { - if (data.getDataFromClient(player) == null) continue; - Player target = data.getPartnerClient(player); - User user1 = player.GetUser(dbContext); - User user2 = target.GetUser(dbContext); + target.SendNotification("Müllsack: " + data.getTrashCount() + " von " + MAX_BAG + "."); + } - //user1 = player.GetUser(dbContext); - //user2 = target.GetUser(dbContext); - /*user1.trashcount += 1; + player.AddAttachment("binbag", true); - if (user1.trashcount == 20) - { - player.SendChatMessage("~y~Dies ist dein 20ter Müllsack."); - } - - player.SendNotification("Müllsack: " + user1.trashcount + " von 20."); + if (data.getTrashCount() == MAX_BAG) + { + ChatService.SendMessage((Player)player, "~y~[Job] ~s~Der Müllwagen ist voll. Fahre nun zurück zur Recyclinganlage!"); if (target != null) { - target.SendNotification("Müllsack: " + user2.trashcount + " von 20."); - user2.trashcount += 1; - - if (user2.trashcount == 20) - { - target.SendChatMessage("~y~Dies ist dein 20ter Müllsack."); - } - } - - dbContext.SaveChanges(); - player.AddAttachment("binbag", true); - */ - - if (player.GetUser(dbContext).trashcount >= 20) - { - ChatService.SendMessage((Player)player, "~y~Job: ~s~Der Müllwagen ist voll. Fahre nun zurück zur Recyclinganlage!"); - if (target != null) - { - ChatService.SendMessage((Player)target, "~y~Job: ~s~Der Müllwagen ist voll! Er muss entleert werden."); - target.TriggerEvent("SERVER:MuellmannZuBase"); - } - player.TriggerEvent("SERVER:MuellmannZuBase"); - } - else - { - //user1 = player.GetUser(dbContext); - //user2 = target.GetUser(dbContext); - user1.trashcount += 1; - player.SendNotification("Müllsack: " + user1.trashcount + " von 20."); - if (target != null) - { - target.SendNotification("Müllsack: " + user2.trashcount + " von 20."); - user2.trashcount += 1; - } - dbContext.SaveChanges(); - } - // player.AddAttachment("binbag", true); - - if (player.GetUser(dbContext).trashcount >= 20) - { - ChatService.SendMessage((Player)player, "~y~Job: ~s~Der Müllwagen ist voll. Fahre nun zurück zur Recyclinganlage!"); - if (target != null) - { - ChatService.SendMessage((Player)target, "~y~Job: ~s~Der Müllwagen ist voll! Er muss entleert werden."); - target.TriggerEvent("SERVER:MuellmannZuBase"); - } - player.TriggerEvent("SERVER:MuellmannZuBase"); - } - else - { - //user1 = player.GetUser(dbContext); - //user2 = target.GetUser(dbContext); - - if (target != null) - { - user1.Wage += 25; - user2.Wage += 25; - - } - else - { - user1.Wage += 50; - } - dbContext.SaveChanges(); + ChatService.SendMessage((Player)target, "~y~[Job] ~s~Der Müllwagen ist voll! Er muss entleert werden."); + target.TriggerEvent("SERVER:MuellmannZuBase"); } + player.TriggerEvent("SERVER:MuellmannZuBase"); + } + else if(data.getTrashCount() > MAX_BAG) + { + data.setTrashCount(MAX_BAG); + ChatService.ErrorMessage((Player)player, "Der Müllwagen ist schon voll."); + } + else + { + + if (target != null) + { + user1.Wage += 25; + user2.Wage += 25; + + } + else + { + user1.Wage += 50; + } + dbContext.SaveChanges(); } - return; } + return; } [RemoteEvent("CLIENT:MuellmannBaseSack")] @@ -321,26 +292,27 @@ namespace ReallifeGamemode.Server.Job if (data.getDataFromClient(player) == null) continue; Player target = data.getPartnerClient(player); - if (target != null) ChatService.SendMessage((Player)target, $"~y~Job: ~s~Fahrzeug wurde entleert. Säcke: {target.GetUser().trashcount}"); - ChatService.SendMessage((Player)player, $"~y~Job: ~s~Fahrzeug wurde entleert. Säcke: {player.GetUser().trashcount}"); + if (target != null) ChatService.SendMessage((Player)target, $"~y~[Job] ~s~Fahrzeug wurde entleert. Säcke: {data.getTrashCount()}"); + ChatService.SendMessage((Player)player, $"~y~[Job] ~s~Fahrzeug wurde entleert. Säcke: {data.getTrashCount()}"); //bonus pro sack using (var dbContext = new DatabaseContext()) { User user1 = player.GetUser(dbContext); User user2 = target.GetUser(dbContext); + int bonus = 5 * data.getTrashCount(); + if (target != null) { - user1.Wage += 250; - user2.Wage += 250; + user1.Wage += (int)(bonus / 2); + user2.Wage += (int)(bonus / 2); } else { - user1.Wage += 500; + user1.Wage += bonus; } - user1.trashcount -= user1.trashcount; - if (target != null) user2.trashcount -= user2.trashcount; + data.setTrashCount(0); dbContext.SaveChanges(); } @@ -353,38 +325,12 @@ namespace ReallifeGamemode.Server.Job public void MuellmannOnPlayerDc(Player player) { - foreach (var data in muellmanData) - { - if (data.getDataFromClient(player) == null) continue; - - if (data.hasFreePlace()) - { - muellmanData.Remove(data); - //müllwagen respawnen - return; - } - - data.removeClientFromData(player); - return; - } + MuellmannJobBeenden(player); } public void MuellmannOnPlayerDeath(Player player) { - foreach (var data in muellmanData) - { - if (data.getDataFromClient(player) == null) continue; - - if (data.hasFreePlace()) - { - muellmanData.Remove(data); - //müllwagen respawnen - return; - } - - data.removeClientFromData(player); - return; - } + MuellmannJobBeenden(player); } [ServerEvent(Event.VehicleDeath)] @@ -396,10 +342,13 @@ namespace ReallifeGamemode.Server.Job { if (data.vehicle == veh) { - //müllfahrzeug respawnen + veh.GetServerVehicle().Spawn(veh); List clients = data.getClientsFromData(); - foreach (var c in clients) { RefuseCollectorJobJobStop(c); } + foreach (var c in clients) + { + MuellmannJobBeenden(c); + } muellmanData.Remove(data); return; @@ -426,15 +375,15 @@ namespace ReallifeGamemode.Server.Job } CheckDataForDuplicatePlayer(player, data); data.setClientToData(player); - //destroy veh + MuellmannJobStarten(player, vehicle); target = data.getPartnerClient(player); if (target == null) return; - ChatService.SendMessage((Player)player, $"~y~Job: ~s~Dein Partner ist {target.Name}!"); - ChatService.SendMessage((Player)target, $"~y~Job: ~s~Dein Partner ist {player.Name}!"); + ChatService.SendMessage((Player)player, $"~y~[Job] ~s~Dein Partner ist {target.Name}!"); + ChatService.SendMessage((Player)target, $"~y~[Job] ~s~Dein Partner ist {player.Name}!"); return; } } @@ -450,8 +399,8 @@ namespace ReallifeGamemode.Server.Job if (target == null) return; - ChatService.SendMessage((Player)player, $"~y~Job: ~s~Dein Partner ist {target.Name}!"); - ChatService.SendMessage((Player)target, $"~y~Job: ~s~Dein Partner ist {player.Name}!"); + ChatService.SendMessage((Player)player, $"~y~[Job] ~s~Dein Partner ist {target.Name}!"); + ChatService.SendMessage((Player)target, $"~y~[Job] ~s~Dein Partner ist {player.Name}!"); } } diff --git a/ReallifeGamemode.Server/Job/TaxiDriverJob.cs b/ReallifeGamemode.Server/Job/TaxiDriverJob.cs index 0b4f9b12..db034056 100644 --- a/ReallifeGamemode.Server/Job/TaxiDriverJob.cs +++ b/ReallifeGamemode.Server/Job/TaxiDriverJob.cs @@ -123,9 +123,15 @@ namespace ReallifeGamemode.Server.Job public static void UpdateFare() { + foreach (var player in GetPlayerInJob()) { User u = player.GetUser(); + if(u == null) + { + continue; + } + if (u.JobId != 1) return; if (!player.HasData("hasPassager")) { player.SetData("hasPassager", false); continue; } int playerId = player.GetUser().Id; diff --git a/ReallifeGamemode.Server/Managers/InteractionManager.cs b/ReallifeGamemode.Server/Managers/InteractionManager.cs index ae4656a1..cc556b6f 100644 --- a/ReallifeGamemode.Server/Managers/InteractionManager.cs +++ b/ReallifeGamemode.Server/Managers/InteractionManager.cs @@ -73,24 +73,28 @@ namespace ReallifeGamemode.Server.Managers { default: player.SetSharedData("blipColor", 0); + player.SetSharedData("nameTagColor", 0); break; case 8: player.SetSharedData("blipColor", 83); + player.SetSharedData("nameTagColor", 8); break; case 7: player.SetSharedData("blipColor", 52); + player.SetSharedData("nameTagColor", 7); break; case 4: player.SetSharedData("blipColor", 5); + player.SetSharedData("nameTagColor", 4); break; case 9: player.SetSharedData("blipColor", 25); + player.SetSharedData("nameTagColor", 9); break; } - dbContext.SaveChanges(); } } @@ -284,6 +288,7 @@ namespace ReallifeGamemode.Server.Managers ChatService.SendMessage(player, "!{02FCFF}Du hast " + target.Name + " aus der Fraktion geworfen."); ChatService.SendMessage(target, "!{02FCFF}Du wurdest von " + player.Name + " aus der Fraktion geworfen."); target.SetSharedData("blipColor", 0); + player.SetSharedData("nameTagColor", 0); dbContext.SaveChanges(); } } @@ -628,7 +633,7 @@ namespace ReallifeGamemode.Server.Managers } else { - if (amount > -9 && amount < 9) + if (amount > -13 && amount < 13) { using (var dbContext = new DatabaseContext()) { @@ -638,6 +643,7 @@ namespace ReallifeGamemode.Server.Managers } player.SendNotification($"~w~Du hast ~y~{targetname} ~b~{amount} ~w~Strafpunkte gegeben. Grund: ~g~{reason}~w~."); target.SendNotification($"~b~{player.GetUser().FactionRank.RankName} | {playername} ~w~hat dir ~y~{amount} ~w~Strafpunkte gegeben.", true); + ChatService.BroadcastFaction("!{#8181E9}HQ: " + targetname + " hat von " + playername + " " + amount + " Strafpunkt(e) erhalten. Gesamt: " + target.GetUser().Points, new List() { 1, 3 }); if (target.GetUser().Points < 0) { using (var dbContext = new DatabaseContext()) @@ -647,10 +653,11 @@ namespace ReallifeGamemode.Server.Managers dbContext.SaveChanges(); } } - else if (target.GetUser().Points >= 8) + else if (target.GetUser().Points >= 12) { - target.SendNotification($"~w~Grund: ~g~{reason}~w~. ~x~Du hast nun ~r~8/8 ~x~Strafpunkten.", true); - target.SendNotification($"~w~Dir wird ~r~Auto- ~w~und ~r~Motorradführerschein ~w~entzogen.", true); + target.SendNotification($"~w~Grund: ~g~{reason}~w~. ~x~Du hast nun ~r~12/12 ~x~Strafpunkten.", true); + target.SendNotification($"~w~Dir wird ~r~Auto- ~w~und ~r~Motorradführerschein ~w~entzogen.", true); //FlashNotif + ChatService.HQMessage(targetname + "hat von" + playername + " " + amount + " Strafpunkt erhalten(e). Gesamt: " + target.GetUser().Points); foreach (var copPlayer in NAPI.Pools.GetAllPlayers()) { User copUser = copPlayer.GetUser(); @@ -663,7 +670,7 @@ namespace ReallifeGamemode.Server.Managers { if (copUser.GetData("duty") == true) { - ChatService.SendMessage(copPlayer, "!{#8181E9}HQ: " + targetname + " besitzt nun keinen Führerschein mehr."); + ChatService.HQMessage(targetname + " besitzt nun keinen Führerschein mehr."); } } } @@ -678,12 +685,12 @@ namespace ReallifeGamemode.Server.Managers } else { - target.SendNotification($"~w~Grund: ~g~{reason}~w~. ~x~Du hast nun ~y~{target.GetUser().Points}/8 ~x~Strafpunkten.", true); + target.SendNotification($"~w~Grund: ~g~{reason}~w~. ~x~Du hast nun ~y~{target.GetUser().Points}/12 ~x~Strafpunkten.", true); } } else { - player.SendNotification("~r~Du kannst nur zwischen 1 und 8 Punkte verteilen!"); + player.SendNotification("~r~Du kannst nur zwischen 1 und 12 Punkte verteilen!"); } } } @@ -796,14 +803,15 @@ namespace ReallifeGamemode.Server.Managers if (!player.IsLoggedIn()) return; List players = NAPI.Pools.GetAllPlayers(); - var listPlayers = players.Select(p => new + var listPlayers = players.Where(p => p.GetUser().Wanteds > 0) + .Select(p => new { Id = p.Handle.Value, p.Name, wanted = p.GetUser().Wanteds, - }) ; + }); - if(listPlayers.Count() > 0) + if (listPlayers.Count() > 0) player.TriggerEvent("showWantedlist", JsonConvert.SerializeObject(listPlayers)); else player.SendNotification("~r~[Fehler] ~w~Es gibt derzeitig keine Verbrecher!"); diff --git a/ReallifeGamemode.Server/Managers/InventoryManager.cs b/ReallifeGamemode.Server/Managers/InventoryManager.cs index ac6325ba..c8befc54 100644 --- a/ReallifeGamemode.Server/Managers/InventoryManager.cs +++ b/ReallifeGamemode.Server/Managers/InventoryManager.cs @@ -560,6 +560,7 @@ namespace ReallifeGamemode.Server.Managers Vector3 textPos = dropPosition; if (iItem is IWeaponDealItem obj) { + player.ClearAttachments(); dropPosition.Z -= 1.05f; grndObject = NAPI.Object.CreateObject(3666746839, dropPosition, new Vector3(0, 0, r.Next(0, 360)), 255, 0); } diff --git a/ReallifeGamemode.Server/Managers/PositionManager.cs b/ReallifeGamemode.Server/Managers/PositionManager.cs index 19736b30..ab097f63 100644 --- a/ReallifeGamemode.Server/Managers/PositionManager.cs +++ b/ReallifeGamemode.Server/Managers/PositionManager.cs @@ -348,7 +348,7 @@ public class BehindVehiclePoint if (!player.HasAttachment("ammobox")) { player.PlayAnimation("anim@heists@box_carry@", "idle", 49); - //player.AddAttachment("ammobox", false); + player.AddAttachment("ammobox", false); NAPI.Player.SetPlayerCurrentWeapon(player, WeaponHash.Unarmed); } } diff --git a/ReallifeGamemode.Server/Report/Report.cs b/ReallifeGamemode.Server/Report/Report.cs index d2e17181..7d42f5ea 100644 --- a/ReallifeGamemode.Server/Report/Report.cs +++ b/ReallifeGamemode.Server/Report/Report.cs @@ -35,6 +35,7 @@ namespace ReallifeGamemode.Server.Report if (listReports.Count == 0) { + ChatService.ErrorMessage(client, "Im Moment gibt es keine Tickets."); return; } User user = client.GetUser(); diff --git a/ReallifeGamemode.Server/Services/ChatService.cs b/ReallifeGamemode.Server/Services/ChatService.cs index d552bb3e..692c4263 100644 --- a/ReallifeGamemode.Server/Services/ChatService.cs +++ b/ReallifeGamemode.Server/Services/ChatService.cs @@ -58,17 +58,14 @@ namespace ReallifeGamemode.Server.Services { User user = c.GetUser(); Faction f = user?.Faction; - if (f != null) - { - if (factions.Find(fT => fT.Id == f.Id) != null) - { - ChatService.SendMessage(c, message); - } - } - /*else if(user.IsAdmin(AdminLevel.ADMIN) && toAdmins) + if (f != null && factions.Find(fT => fT.Id == f.Id) != null) { ChatService.SendMessage(c, message); - }*/ + } + else if (user.IsAdmin(AdminLevel.ADMIN) && toAdmins) + { + ChatService.SendMessage(c, message); + } } } diff --git a/ReallifeGamemode.Server/Util/AttachmentSync.cs b/ReallifeGamemode.Server/Util/AttachmentSync.cs index cfa403ef..822a5c76 100644 --- a/ReallifeGamemode.Server/Util/AttachmentSync.cs +++ b/ReallifeGamemode.Server/Util/AttachmentSync.cs @@ -97,7 +97,6 @@ public static class AttachmentSync } } - entity.ResetSharedData("attachmentsData"); entity.SetData("Attachments", new List()); } @@ -141,15 +140,18 @@ public class AttachmentSyncExample : Script public void attachment(Player player) { Vehicle veh = player.Vehicle; - if (!veh.HasAttachment("weapondeal")) + if (!player.HasAttachment("ammobox")) { - veh.AddAttachment("weapondeal", false); + player.AddAttachment("ammobox", false); + player.PlayAnimation("anim@heists@box_carry@", "idle", 49); //veh.AddAttachment("weapondeal1", false); //veh.AddAttachment("weapondeal2", false); } else { - veh.ClearAttachments(); + player.StopAnimation(); + + player.ClearAttachments(); } } diff --git a/ReallifeGamemode.Server/Util/ThreadTimers.cs b/ReallifeGamemode.Server/Util/ThreadTimers.cs index f5dd07ec..92b16424 100644 --- a/ReallifeGamemode.Server/Util/ThreadTimers.cs +++ b/ReallifeGamemode.Server/Util/ThreadTimers.cs @@ -1,5 +1,6 @@ using System.Timers; using GTANetworkAPI; +using ReallifeGamemode.Server.Factions.Medic; using ReallifeGamemode.Server.Finance; using ReallifeGamemode.Server.Job; using ReallifeGamemode.Server.Managers; @@ -11,6 +12,7 @@ namespace ReallifeGamemode.Server.Util public class ThreadTimers { private static Timer timer500 = new Timer(500); //0.5 seconds timer + private static Timer timer1000 = new Timer(1000); //1 seconds timer private static Timer timer2500 = new Timer(2500); //2.5 seconds timer private static Timer timer10000 = new Timer(10000); // 10 second timer private static Timer timer60000 = new Timer(60000); //60 seconds timer @@ -20,6 +22,9 @@ namespace ReallifeGamemode.Server.Util timer500.Start(); timer500.Elapsed += Timer500_Elapsed; + timer1000.Start(); + timer1000.Elapsed += Timer1000_Elapsed; + timer2500.Start(); timer2500.Elapsed += Timer2500_Elapsed; @@ -39,6 +44,14 @@ namespace ReallifeGamemode.Server.Util }); } + private static void Timer1000_Elapsed(object sender, ElapsedEventArgs e) + { + NAPI.Task.Run(() => + { + Medic.UpdateTaskTimeLeft(); + }); + } + private static void Timer60000_Elapsed(object sender, ElapsedEventArgs e) { NAPI.Task.Run(() => diff --git a/ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs b/ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs index 737b70ad..e6f28349 100644 --- a/ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs +++ b/ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs @@ -14,7 +14,7 @@ namespace ReallifeGamemode.Server.WeaponDeal { private const int WEAPON_AMOUNT_GANG = 2; private const int WEAPON_AMOUNT_COP = 8; - private const int WEAPON_AMOUNT_COP_STUNGUN = 2; + private const int WEAPON_AMOUNT_COP_STUNGUN = 12; public static bool checkWeaponDbyVehicle(Vehicle vehicle) { if (!vehicle.HasData("WeaponDealLoad") || vehicle.GetData("WeaponDealLoad") == false) @@ -185,6 +185,9 @@ namespace ReallifeGamemode.Server.WeaponDeal Vehicle fVeh = VehicleManager.GetVehicleFromServerVehicle(factionVehicle); fVeh.SetData("weaponDeal", false); fVeh.SetData("WeaponDealLoad", true); + fVeh.AddAttachment("weapondeal", false); + fVeh.AddAttachment("weapondeal1", false); + fVeh.AddAttachment("weapondeal2", false); InventoryManager.RemoveAllItemsfromVehicleInventory(fVeh); int oMembers = NAPI.Pools.GetAllPlayers().Where(p => p.IsLoggedIn() && p.GetUser(context).FactionId == user.FactionId).Count(); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..48e341a0 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3 @@ +{ + "lockfileVersion": 1 +}