diff --git a/.editorconfig b/.editorconfig index b42c8ea4..0fadfff1 100644 --- a/.editorconfig +++ b/.editorconfig @@ -122,3 +122,5 @@ csharp_preserve_single_line_blocks = true [*.vb] # Modifier preferences visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:suggestion +[*.js] +encoding=utf-8-bom \ No newline at end of file diff --git a/.gitignore b/.gitignore index 4743a2ce..7dd68243 100644 --- a/.gitignore +++ b/.gitignore @@ -336,7 +336,7 @@ ASALocalRun/ launchSettings.json tmp/ -index.js +ReallifeGamemode.Client/index.js # post build config postbuild.config.xml diff --git a/ReallifeGamemode.Client/Business/cardealer.ts b/ReallifeGamemode.Client/Business/cardealer.ts index b6667a31..3a7c4d8e 100644 --- a/ReallifeGamemode.Client/Business/cardealer.ts +++ b/ReallifeGamemode.Client/Business/cardealer.ts @@ -1,4 +1,4 @@ -import * as NativeUI from '../libs/NativeUI'; +import * as NativeUI from '../libs/NativeUI'; const Menu = NativeUI.Menu; const UIMenuItem = NativeUI.UIMenuItem; const UIMenuListItem = NativeUI.UIMenuListItem; @@ -37,6 +37,8 @@ export default function carDealer(globalData: IGlobalData) { var text = label.text.replace("SHOPVEHICLE", realName); label.text = text; + entity.setOnGroundProperly(); + entity.setExplodesOnHighExplosionDamage(false); entity.freezePosition(true); } @@ -62,7 +64,7 @@ export default function carDealer(globalData: IGlobalData) { shopMenu.AddItem(priceItem); var targetsCollection = new ItemsCollection(availableOptions); - var targetItem = new UIMenuListItem("Kaufen für", "Wähle den Besitzer aus", targetsCollection); + var targetItem = new UIMenuListItem("Kaufen für", "Wähle den Besitzer aus", targetsCollection); shopMenu.AddItem(targetItem); shopMenu.ListChange.on((item, index) => { diff --git a/ReallifeGamemode.Client/CharCreator/data.ts b/ReallifeGamemode.Client/CharCreator/data.ts index bb827216..83801bab 100644 --- a/ReallifeGamemode.Client/CharCreator/data.ts +++ b/ReallifeGamemode.Client/CharCreator/data.ts @@ -1,4 +1,4 @@ -const fathers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 42, 43, 44]; +const fathers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 42, 43, 44]; const mothers = [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 45]; const fatherNames = ["Benjamin", "Daniel", "Joshua", "Noah", "Andrew", "Juan", "Alex", "Isaac", "Evan", "Ethan", "Vincent", "Angel", "Diego", "Adrian", "Gabriel", "Michael", "Santiago", "Kevin", "Louis", "Samuel", "Anthony", "Claude", "Niko", "John"]; const motherNames = ["Hannah", "Aubrey", "Jasmine", "Gisele", "Amelia", "Isabella", "Zoe", "Ava", "Camila", "Violet", "Sophia", "Evelyn", "Nicole", "Ashley", "Gracie", "Brianna", "Natalie", "Olivia", "Elizabeth", "Charlotte", "Emma", "Misty"]; diff --git a/ReallifeGamemode.Client/CharCreator/main.ts b/ReallifeGamemode.Client/CharCreator/main.ts index 1c79dc30..daee8540 100644 --- a/ReallifeGamemode.Client/CharCreator/main.ts +++ b/ReallifeGamemode.Client/CharCreator/main.ts @@ -1,4 +1,4 @@ -// shitcode will be better in the future +// shitcode will be better in the future // , \u00dc, \u00fc // , \u00c4, \u00e4 // , \u00d6, \u00f6 diff --git a/ReallifeGamemode.Client/Gui/Inventory/inventory.ts b/ReallifeGamemode.Client/Gui/Inventory/inventory.ts index afb9e735..22b3c8f2 100644 --- a/ReallifeGamemode.Client/Gui/Inventory/inventory.ts +++ b/ReallifeGamemode.Client/Gui/Inventory/inventory.ts @@ -1,4 +1,4 @@ -import InputHelper from '../../inputhelper'; +import InputHelper from '../../inputhelper'; export default function inventory(globalData: IGlobalData) { diff --git a/ReallifeGamemode.Client/Gui/Inventory/inventory_old.ts b/ReallifeGamemode.Client/Gui/Inventory/inventory_old.ts index 2f6deb02..97698e92 100644 --- a/ReallifeGamemode.Client/Gui/Inventory/inventory_old.ts +++ b/ReallifeGamemode.Client/Gui/Inventory/inventory_old.ts @@ -1,4 +1,4 @@ -import InputHelper from '../../inputhelper'; +import InputHelper from '../../inputhelper'; export default function inventory(globalData: IGlobalData) { var q; diff --git a/ReallifeGamemode.Client/Gui/deathscreen.ts b/ReallifeGamemode.Client/Gui/deathscreen.ts index 8374bd18..32826cce 100644 --- a/ReallifeGamemode.Client/Gui/deathscreen.ts +++ b/ReallifeGamemode.Client/Gui/deathscreen.ts @@ -1,4 +1,4 @@ -/** +/** * @overview Life of German Reallife - Gui Infobox infobox.js * @author VegaZ * @copyright (c) 2008 - 2018 Life of German @@ -68,7 +68,7 @@ export default function deathScreen() { var medicString; if (dutyMedics > 0) { - medicString = "Das L.S.E.D. wurde benachrichtigt\nDerzeit"; + medicString = "Das L.S.E.D. wurde benachrichtigt\nDerzeit "; if (dutyMedics === 1) { medicString += "befindet sich ~g~" + dutyMedics + " Mitglied"; } else { @@ -108,4 +108,4 @@ export default function deathScreen() { } } }); -} \ No newline at end of file +} diff --git a/ReallifeGamemode.Client/Gui/infobox.ts b/ReallifeGamemode.Client/Gui/infobox.ts index 5e53bb15..cf1ba033 100644 --- a/ReallifeGamemode.Client/Gui/infobox.ts +++ b/ReallifeGamemode.Client/Gui/infobox.ts @@ -1,8 +1,8 @@ /** - * @overview Life of German Reallife - Gui Infobox infobox.js - * @author VegaZ - * @copyright (c) 2008 - 2018 Life of German - */ +* @overview Life of German Reallife - Gui Infobox infobox.js +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ import moneyFormat from "../moneyformat"; @@ -16,6 +16,7 @@ export default function (globalData: IGlobalData): void { var adutyMode = false; var adminUnshow = false; var adminTSupport = false; + var noDmZone = false; var dutyMode = false; let jailTime = 0; let att_score = 0; @@ -27,6 +28,7 @@ export default function (globalData: IGlobalData): void { var cdTimestamp; var countdownText; var blackScreenMode = false; + let spawnschutz = false; let posX = 0.92; let posY = 0.45; @@ -84,6 +86,14 @@ export default function (globalData: IGlobalData): void { blackScreenMode = toggle; }); + mp.events.add("toggleNoDmZone", (toggle) => { + noDmZone = toggle; + }); + + mp.events.add("toggleSpawnschutz", (toggle) => { + spawnschutz = toggle; + }); + mp.events.add("jailTime", (time) => { jailTime = JSON.parse(time); }); @@ -345,6 +355,28 @@ export default function (globalData: IGlobalData): void { }) } + if (noDmZone) { + mp.game.graphics.drawText("~r~NoDM Zone", [0.92, 0.7], + { + font: 2, + color: [255, 255, 255, 255], + scale: [0.7, 0.7], + outline: true, + centre: false + }) + } + + if (spawnschutz) { + mp.game.graphics.drawText("~r~Spawnschutz", [0.92, 0.75], + { + font: 2, + color: [255, 255, 255, 255], + scale: [0.7, 0.7], + outline: true, + centre: false + }) + } + if (countdown > 0) { var now = Date.now(); var diff = Math.trunc((now - cdTimestamp) / 1000); @@ -367,4 +399,4 @@ export default function (globalData: IGlobalData): void { mp.game.graphics.drawRect(0, 0, 10000, 100000, 0, 0, 0, 255); } }); -} \ No newline at end of file +} diff --git a/ReallifeGamemode.Client/Gui/interiors.ts b/ReallifeGamemode.Client/Gui/interiors.ts index d4736eb0..a26195bf 100644 --- a/ReallifeGamemode.Client/Gui/interiors.ts +++ b/ReallifeGamemode.Client/Gui/interiors.ts @@ -1,4 +1,4 @@ -import game from ".."; +import game from ".."; import { Key } from "../game"; var interiorId = -1; @@ -14,7 +14,7 @@ game.events.add('SERVER:InteriorManager_ClearHelpText', () => { game.events.add('SERVER:InteriorManager_ShowHelpText', (interior, intId, entEx) => { //game.ui.setHelpText('Drücke ~INPUT_CONTEXT~, um ~b~' + interior + ' ~s~zu ' + (entEx === 0 ? 'betreten' : 'verlassen')); - helpText = "~s~Drücke ~g~E~s~ um ~b~" + interior + " ~s~zu " + (entEx === 0 ? "betreten" : "verlassen"); + helpText = "~s~Drücke ~g~E~s~, um ~b~" + interior + " ~s~zu " + (entEx === 0 ? "betreten" : "verlassen"); mp.events.call("renderHelpTextOnScreen", helpText) interiorId = intId; enterExit = entEx; @@ -25,4 +25,4 @@ game.events.add('SERVER:InteriorManager_ShowHelpText', (interior, intId, entEx) function keyPressHandler() { if (game.ui.inChat) return; game.events.callServer('InteriorManager_UseTeleport', [interiorId, enterExit]); -} \ No newline at end of file +} diff --git a/ReallifeGamemode.Client/Gui/playerlist.ts b/ReallifeGamemode.Client/Gui/playerlist.ts index 4fadec66..1d176cba 100644 --- a/ReallifeGamemode.Client/Gui/playerlist.ts +++ b/ReallifeGamemode.Client/Gui/playerlist.ts @@ -1,4 +1,4 @@ -/** +/** * @overview Life of German Reallife - Gui Playerlist playerlist.js * @author VegaZ. Siga. * @copyright (c) 2008 - 2018 Life of German diff --git a/ReallifeGamemode.Client/Gui/taximeter.ts b/ReallifeGamemode.Client/Gui/taximeter.ts index fe934bef..b807a298 100644 --- a/ReallifeGamemode.Client/Gui/taximeter.ts +++ b/ReallifeGamemode.Client/Gui/taximeter.ts @@ -1,4 +1,4 @@ -import InputHelper from '../inputhelper'; +import InputHelper from '../inputhelper'; let browser: BrowserMp; let price: Number; diff --git a/ReallifeGamemode.Client/Gui/wanteds.ts b/ReallifeGamemode.Client/Gui/wanteds.ts index 2b04bbfc..9e8c75d0 100644 --- a/ReallifeGamemode.Client/Gui/wanteds.ts +++ b/ReallifeGamemode.Client/Gui/wanteds.ts @@ -1,11 +1,19 @@ -export default function wanteds(globalData: IGlobalData) { +let wantedCount = 0; + +export default function wanteds(globalData: IGlobalData) { var browser = mp.browsers.new("package://assets/html/wanteds/index.html"); mp.events.add("SERVER:SetWanteds", (count: number) => { browser.execute(`setWanteds(${count});`); + wantedCount = count; }); + mp.events.add("SERVER:SetWantedFlash", (flash) => { browser.execute(`setFlashing(${flash});`); }); +} + +export function getWantedCount(): number { + return wantedCount; } \ No newline at end of file diff --git a/ReallifeGamemode.Client/Jobs/BusRouteSelect.ts b/ReallifeGamemode.Client/Jobs/BusRouteSelect.ts index f9ca378f..c5c33244 100644 --- a/ReallifeGamemode.Client/Jobs/BusRouteSelect.ts +++ b/ReallifeGamemode.Client/Jobs/BusRouteSelect.ts @@ -19,16 +19,28 @@ let cancelItem = new UIMenuItem("Abbrechen", ""); cancelItem.BackColor = new Color(213, 0, 0); cancelItem.HighlightedBackColor = new Color(229, 57, 53); +var routeMenu: NativeUI.Menu; +var busRouteSelectColShape = mp.colshapes.newCircle(-535, -2144, 2.5); + export default function busRouteList(globalData: IGlobalData) { - var routeMenu: NativeUI.Menu; var skillSelect; var routeSelect; var skill = 0; + var routeSelected = false; + + mp.events.add(RageEnums.EventKey.PLAYER_EXIT_COLSHAPE, (colshape) => { + if (colshape == busRouteSelectColShape) { + if (routeMenu && routeMenu.Visible) { + routeMenu.Close(); + } + } + }); mp.events.add('SERVER:StartBusJob', (jobskill) => { skill = jobskill; if (!globalData.InMenu) { globalData.InMenu = true; + skillSelect = ["Anfänger", "Fortgeschrittener", "Profi"]; routeMenu = new Menu("Bus Job", "", new Point(0, screenRes.y / 3), null, null); @@ -59,20 +71,23 @@ export default function busRouteList(globalData: IGlobalData) { else { mp.events.callRemote("CLIENT:StartBusRoute", routeSelect); + routeSelected = true; routeMenu.Close(); globalData.InMenu = false; } } else if (item.Text === "Abbrechen") { - mp.events.callRemote("CLIENT:Job_StopJob"); - routeMenu.Close(); - globalData.InMenu = false; } }); routeMenu.MenuClose.on(() => { + if (!routeSelected) { + mp.events.callRemote("CLIENT:Job_StopJob"); + } + routeSelected = false; + globalData.InMenu = false; }); } diff --git a/ReallifeGamemode.Client/Login/main.ts b/ReallifeGamemode.Client/Login/main.ts index 3fe6e020..739d77f9 100644 --- a/ReallifeGamemode.Client/Login/main.ts +++ b/ReallifeGamemode.Client/Login/main.ts @@ -1,8 +1,9 @@ /** * @overview Life of German Reallife - Login Main main.js - * @author VegaZ, hydrant + * @author VegaZ, hydrant, balbo * @copyright (c) 2008 - 2018 Life of German */ +import { getWantedCount } from "../Gui/wanteds"; export default function (globalData: IGlobalData): void { var loginBrowser: BrowserMp; diff --git a/ReallifeGamemode.Client/Player/antiafk.ts b/ReallifeGamemode.Client/Player/antiafk.ts index 1db1251f..229cd705 100644 --- a/ReallifeGamemode.Client/Player/antiafk.ts +++ b/ReallifeGamemode.Client/Player/antiafk.ts @@ -17,7 +17,7 @@ let distance = mp.game.gameplay.getDistanceBetweenCoords(lp.x, lp.y, lp.z, np.x, np.y, np.z, false); - if (distance <= 5) { + if (distance <= 1.5) { if (!afkStatus) { afkCounter++; } diff --git a/ReallifeGamemode.Client/Player/handsup.ts b/ReallifeGamemode.Client/Player/handsup.ts new file mode 100644 index 00000000..812689e5 --- /dev/null +++ b/ReallifeGamemode.Client/Player/handsup.ts @@ -0,0 +1,11 @@ +export default function handsup() { + mp.events.add("SERVER:Handsup_CheckIfPlayerCanHandsup", () => { + var player = mp.players.local; + + var isStopped = player.isStopped(); + + if (isStopped) { + mp.events.callRemote("CLIENT:Handsup_TogglePlayerHup"); + } + }); +} \ No newline at end of file diff --git a/ReallifeGamemode.Client/Player/keys.ts b/ReallifeGamemode.Client/Player/keys.ts index 9c344a16..92ffe3e0 100644 --- a/ReallifeGamemode.Client/Player/keys.ts +++ b/ReallifeGamemode.Client/Player/keys.ts @@ -138,7 +138,7 @@ export default function keys(globalData: IGlobalData) { }); mp.keys.bind(0x7A, false, () => { - mp.gui.takeScreenshot(new Date().toLocaleDateString(), 1, 100, 80); + mp.gui.takeScreenshot(new Date().toLocaleTimeString() + ".png", 1, 100, 80); }); KeyBinder.bind("ctrl+h", () => { diff --git a/ReallifeGamemode.Client/Player/polygons.ts b/ReallifeGamemode.Client/Player/polygons.ts new file mode 100644 index 00000000..ea468a4b --- /dev/null +++ b/ReallifeGamemode.Client/Player/polygons.ts @@ -0,0 +1,94 @@ +import polygons from "../polygons"; + +//Start: Eingang direkt rechts, rechts entlang +const prisonVector1 = new mp.Vector3(1809.99365234375, 2612.373291015625, 40.50623321533203); +const prisonVector2 = new mp.Vector3(1810.377197265625, 2620.338623046875, 40.51300048828125); +const prisonVector3 = new mp.Vector3(1835.8336181640625, 2688.819091796875, 40.4307975769043); +const prisonVector4 = new mp.Vector3(1830.5731201171875, 2703.89990234375, 40.42714309692383); +const prisonVector5 = new mp.Vector3(1776.7342529296875, 2747.79052734375, 40.42777633666992); +const prisonVector6 = new mp.Vector3(1762.360107421875, 2752.788818359375, 40.42710494995117); +const prisonVector7 = new mp.Vector3(1662.0726318359375, 2749.177001953125, 40.444488525390625); +const prisonVector8 = new mp.Vector3(1648.1600341796875, 2742.01611328125, 40.441619873046875); +const prisonVector9 = new mp.Vector3(1584.302978515625, 2679.99072265625, 40.47876739501953); +const prisonVector10 = new mp.Vector3(1575.2301025390625, 2667.2109375, 40.48185729980469); +const prisonVector11 = new mp.Vector3(1547.1693115234375, 2591.489990234375, 40.388912200927734); +const prisonVector12 = new mp.Vector3(1546.39892578125, 2576.266845703125, 40.38877868652344); +const prisonVector13 = new mp.Vector3(1550.493896484375, 2482.98388671875, 40.38750076293945); +const prisonVector14 = new mp.Vector3(1557.9322509765625, 2468.98681640625, 40.387237548828125); +const prisonVector15 = new mp.Vector3(1652.527099609375, 2409.1259765625, 40.40341567993164); +const prisonVector16 = new mp.Vector3(1667.7176513671875, 2407.0595703125, 40.401432037353516); +const prisonVector17 = new mp.Vector3(1749.3123779296875, 2419.23779296875, 40.42228698730469); +const prisonVector18 = new mp.Vector3(1762.95849609375, 2426.209228515625, 40.42059326171875); +const prisonVector19 = new mp.Vector3(1809.08837890625, 2473.969970703125, 40.445960998535156); +const prisonVector20 = new mp.Vector3(1814.2039794921875, 2489.00830078125, 40.44499588012695); +const prisonVector21 = new mp.Vector3(1807.0340576171875, 2535.93212890625, 38.4123420715332); +const prisonVector22 = new mp.Vector3(1809.77587890625, 2590.69775390625, 38.41337966918945); +const prisonVector23 = new mp.Vector3(1819.170654296875, 2597.941650390625, 40.525978088378906); +const prisonVector24 = new mp.Vector3(1819.3084716796875, 2612.3154296875, 40.52067947387695); + +const busbaseVector1 = new mp.Vector3(-522.4485, -2138.7021, 7.7564063); +const busbaseVector2 = new mp.Vector3(-584.9822, -2072.467, 5.9921026); +const busbaseVector3 = new mp.Vector3(-669.1689, -2172.7917, 6.009973); +const busbaseVector4 = new mp.Vector3(-600.4804, -2230.3953, 6.213662); + +const stadthalleVector1 = new mp.Vector3(-464.26273, -242.73814, 35.946384); +const stadthalleVector2 = new mp.Vector3(-505.32938, -170.14832, 37.859695); +const stadthalleVector3 = new mp.Vector3(-589.5164, -224.41574, 36.648193); +const stadthalleVector4 = new mp.Vector3(-556.6909, -280.71564, 35.163292); + +const fahrschuleVector1 = new mp.Vector3(-812.13043, -1406.9983, 4.9805145); +const fahrschuleVector2 = new mp.Vector3(-727.035, -1305.2482, 5.084054); +const fahrschuleVector3 = new mp.Vector3(-757.4177, -1279.31, 5.1093183); +const fahrschuleVector4 = new mp.Vector3(-832.14087, -1268.561, 4.9827914); +const fahrschuleVector5 = new mp.Vector3(-856.8085, -1286.7786, 6.474576); + +const pilotAnfaengerVector1 = new mp.Vector3(1759.6045, 3305.2988, 41.1526); +const pilotAnfaengerVector2 = new mp.Vector3(1785.29944, 3230.2786, 42.553444); +const pilotAnfaengerVector3 = new mp.Vector3(1655.139, 3198.6257, 42.723602); +const pilotAnfaengerVector4 = new mp.Vector3(1624.4799, 3294.2612, 39.53612); + +const pilotProfiVector1 = new mp.Vector3(-1595.5433, -3130.2798, 13.944942); +const pilotProfiVector2 = new mp.Vector3(-1679.6715, -3082.12, 13.948778); +const pilotProfiVector3 = new mp.Vector3(-1728.0858, -3164.9736, 14.055883); +const pilotProfiVector4 = new mp.Vector3(-1640.4034, -3213.0503, 13.8741665); + +const muellbaseVector1 = new mp.Vector3(521.6251, -2194.5068, 5.985945); +const muellbaseVector2 = new mp.Vector3(454.88348, -2158.1938, 5.9788494); +const muellbaseVector3 = new mp.Vector3(529.06635, -2088.4097, 8.303088); + +const polygon_busbase = polygons.add([busbaseVector1, busbaseVector2, busbaseVector3, busbaseVector4], 15, false, [255, 155, 0, 255], 0); +const polygon_stadthalle = polygons.add([stadthalleVector1, stadthalleVector2, stadthalleVector3, stadthalleVector4], 15, false, [255, 155, 0, 255], 0); +const polygon_fahrschule = polygons.add([fahrschuleVector1, fahrschuleVector2, fahrschuleVector3, fahrschuleVector4, fahrschuleVector5], 15, false, [255, 155, 0, 255], 0); +const polygon_pilotAnfaenger = polygons.add([pilotAnfaengerVector1, pilotAnfaengerVector2, pilotAnfaengerVector3, pilotAnfaengerVector4], 15, false, [255, 155, 0, 255], 0); +const polygon_pilotProfi = polygons.add([pilotProfiVector1, pilotProfiVector2, pilotProfiVector3, pilotProfiVector4], 15, false, [255, 155, 0, 255], 0); +const polygon_muellbase = polygons.add([muellbaseVector1, muellbaseVector2, muellbaseVector3], 15, false, [255, 155, 0, 255], 0); + +const polygon_prison = polygons.add([prisonVector1, prisonVector2, prisonVector3, prisonVector4, prisonVector5, prisonVector6, prisonVector7, prisonVector8, + prisonVector9, prisonVector10, prisonVector11, prisonVector12, prisonVector13, prisonVector14, prisonVector15, prisonVector16, + prisonVector17, prisonVector18, prisonVector19, prisonVector20, prisonVector21, prisonVector22, prisonVector23, prisonVector24], 40, false, [255, 155, 0, 255], 0); + +export let listNoDMZones = [polygon_busbase, polygon_stadthalle, polygon_fahrschule, polygon_pilotAnfaenger, polygon_pilotProfi, polygon_muellbase]; +export let isInAnyNoDMPolygon; + +export default function polygonHandler() { + + mp.events.add('playerEnterPolygon', (polygon) => { + + if (listNoDMZones.indexOf(polygon) != -1){ + mp.events.call('toggleNoDmZone', true); + isInAnyNoDMPolygon = true; + } + }); + + mp.events.add('playerLeavePolygon', (polygon) => { + + if (listNoDMZones.indexOf(polygon) != -1) { + mp.events.call('toggleNoDmZone', false); + isInAnyNoDMPolygon = false; + } + + if (polygon == polygon_prison) { + mp.events.callRemote("SERVER:BreakOutIfInPrison"); + } + }); +} diff --git a/ReallifeGamemode.Client/Player/spawnschutz.ts b/ReallifeGamemode.Client/Player/spawnschutz.ts new file mode 100644 index 00000000..848d7c93 --- /dev/null +++ b/ReallifeGamemode.Client/Player/spawnschutz.ts @@ -0,0 +1,24 @@ +export let spawnschutzEnabled = true; +var spawnschutzTimer; + +export default function spawnschutz() { + + mp.events.add("enableSpawnschutz", () => { + spawnschutzEnabled = true; + mp.events.call("toggleSpawnschutz", true); + mp.events.call("triggerSpawnschutzTimer"); + }); + + mp.events.add("abortSpawnschutz", () => { + spawnschutzEnabled = false; + mp.events.call("toggleSpawnschutz", false); + clearInterval(spawnschutzTimer); + }); + + mp.events.add("triggerSpawnschutzTimer", () => { + spawnschutzTimer = setTimeout(() => { + mp.events.call("toggleSpawnschutz", false); + spawnschutzEnabled = false; + }, 60000); + }); +} \ No newline at end of file diff --git a/ReallifeGamemode.Client/Player/weaponlist.ts b/ReallifeGamemode.Client/Player/weaponlist.ts index 49f640c0..cba4f2d6 100644 --- a/ReallifeGamemode.Client/Player/weaponlist.ts +++ b/ReallifeGamemode.Client/Player/weaponlist.ts @@ -1,4 +1,4 @@ -import * as NativeUI from '../libs/NativeUI'; +import * as NativeUI from '../libs/NativeUI'; const Menu = NativeUI.Menu; const UIMenuItem = NativeUI.UIMenuItem; @@ -10,7 +10,7 @@ const ItemsCollection = NativeUI.ItemsCollection; const Color = NativeUI.Color; let screenRes = mp.game.graphics.getScreenResolution(0, 0); -let saveItem = new UIMenuItem("Waffen Nehmen", ""); +let saveItem = new UIMenuItem("Waffen nehmen", ""); saveItem.BackColor = new Color(13, 71, 161); saveItem.HighlightedBackColor = new Color(25, 118, 210); @@ -131,7 +131,7 @@ export default function weaponList(globalData: IGlobalData) { weaponMenu.ItemSelect.on((item) => { - if (item.Text === "Waffen Nehmen") { + if (item.Text === "Waffen nehmen") { mp.events.callRemote("saveWeaponSelection", primary, secondary, melee, specialWep, armor); weaponMenu.Close(); globalData.InMenu = false; @@ -150,4 +150,4 @@ export default function weaponList(globalData: IGlobalData) { }); } }); -} \ No newline at end of file +} diff --git a/ReallifeGamemode.Client/Speedometer/index.ts b/ReallifeGamemode.Client/Speedometer/index.ts index a3926f4a..d6bad213 100644 --- a/ReallifeGamemode.Client/Speedometer/index.ts +++ b/ReallifeGamemode.Client/Speedometer/index.ts @@ -1,4 +1,4 @@ -let player = mp.players.local; +let player = mp.players.local; export default function speedometer(globalData: IGlobalData) { var dictLoaded = false; diff --git a/ReallifeGamemode.Client/Tuning/colors.ts b/ReallifeGamemode.Client/Tuning/colors.ts index 4b8ccefc..2f5533d6 100644 --- a/ReallifeGamemode.Client/Tuning/colors.ts +++ b/ReallifeGamemode.Client/Tuning/colors.ts @@ -1,4 +1,4 @@ -const vehicleColors = { +const vehicleColors = { "Klassisch (Util)": { "Schwarz": 15, "Silber": 18, @@ -126,7 +126,7 @@ const vehicleColors = { "Lila": 148, "Dunkellila": 149, "W\u00fcstenbraun": 153, - "W\u00fcstenbräune": 154 + "W\u00fcstenbr�une": 154 }, "Spezial": { "Geb\u00fcrsteter Stahl": 117, diff --git a/ReallifeGamemode.Client/Voice/main.ts b/ReallifeGamemode.Client/Voice/main.ts index eccf7c9d..8405046e 100644 --- a/ReallifeGamemode.Client/Voice/main.ts +++ b/ReallifeGamemode.Client/Voice/main.ts @@ -1,4 +1,4 @@ -/** +/** * @overview Life of German Reallife - Voice Main main.ts * @author Zeuto * @copyright (c) 2008 - 2019 Life of German diff --git a/ReallifeGamemode.Client/admin/anticheat.ts b/ReallifeGamemode.Client/admin/anticheat.ts index 44807c32..b7d0a03f 100644 --- a/ReallifeGamemode.Client/admin/anticheat.ts +++ b/ReallifeGamemode.Client/admin/anticheat.ts @@ -32,7 +32,7 @@ }); mp.events.add("client:checkInvincible", () => { - if (mp.players.local.dimension == 0) return + //if (mp.players.local.dimension == 0) return if (!Behaviour.active) return var healthBefore = Behaviour.health mp.players.local.applyDamageTo(1, true); @@ -49,9 +49,9 @@ }, 500); }) - setInterval(() => { - mp.events.call("client:checkInvincible") - }, 30000); + //setInterval(() => { + // mp.events.call("client:checkInvincible") + //}, 30000); mp.events.add('SERVER:AntiCheat:weaponSwap', () => { Behaviour.resetWeapon() @@ -62,7 +62,7 @@ mp.events.callRemote("CLIENT:CheatDetection", "Unallowed Weapon", Behaviour.weapon) } if (Behaviour.reloadingWeapon) { - mp.events.callRemote("CLIENT:CheatDetection", "No Reload") + //mp.events.callRemote("CLIENT:CheatDetection", "No Reload") Behaviour.resetWeapon() } Behaviour.updateMagSize() @@ -182,9 +182,24 @@ var Behaviour = new PlayerBehaviour() var loop = Behaviour.secs() + function isUsingController() { + return !mp.game.controls.isInputDisabled(0); + } + mp.events.add("render", () => { mp.game.player.setHealthRechargeMultiplier(0); + if (isUsingController()) { + mp.game.controls.disableControlAction(32, 24, true); + mp.game.controls.disableControlAction(32, 25, true); + + mp.game.controls.disableControlAction(32, 91, true); + mp.game.controls.disableControlAction(32, 92, true); + + mp.game.controls.disableControlAction(32, 69, true); + mp.game.controls.disableControlAction(32, 70, true); + } + Behaviour.health = Number(mp.players.local.getHealth()) + Number(mp.players.local.getArmour()) if (loop < Behaviour.secs()) { if (Behaviour.active) { diff --git a/ReallifeGamemode.Client/assets/chat/index.html b/ReallifeGamemode.Client/assets/chat/index.html deleted file mode 100644 index d4354663..00000000 --- a/ReallifeGamemode.Client/assets/chat/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - -
- -
- - - - \ No newline at end of file diff --git a/ReallifeGamemode.Client/assets/chat/style/checkbox.css b/ReallifeGamemode.Client/assets/css/chat/checkbox.css similarity index 94% rename from ReallifeGamemode.Client/assets/chat/style/checkbox.css rename to ReallifeGamemode.Client/assets/css/chat/checkbox.css index 53fddb26..5d5fb115 100644 --- a/ReallifeGamemode.Client/assets/chat/style/checkbox.css +++ b/ReallifeGamemode.Client/assets/css/chat/checkbox.css @@ -1 +1 @@ -input[type=checkbox].css-checkbox{position:absolute;z-index:-1000;left:-1000px;overflow:hidden;clip:rect(0 0 0 0);height:1px;width:1px;margin:-1px;padding:0;border:0;}input[type=checkbox].css-checkbox+label.css-label{height:20px;width:20px;display:inline-block;background-repeat:no-repeat;background-position:0 0;cursor:pointer;}input[type=checkbox].css-checkbox:checked+label.css-label:after{content:'x';color:white;}label.css-label{background:#7b3784;border-radius:2px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;} \ No newline at end of file +input[type=checkbox].css-checkbox{position:absolute;z-index:-1000;left:-1000px;overflow:hidden;clip:rect(0 0 0 0);height:1px;width:1px;margin:-1px;padding:0;border:0;}input[type=checkbox].css-checkbox+label.css-label{height:20px;width:20px;display:inline-block;background-repeat:no-repeat;background-position:0 0;cursor:pointer;}input[type=checkbox].css-checkbox:checked+label.css-label:after{content:'x';color:white;}label.css-label{background:#7b3784;border-radius:2px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;} diff --git a/ReallifeGamemode.Client/assets/css/chat/main.css b/ReallifeGamemode.Client/assets/css/chat/main.css new file mode 100644 index 00000000..a8d28c93 --- /dev/null +++ b/ReallifeGamemode.Client/assets/css/chat/main.css @@ -0,0 +1,108 @@ +html { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +*, *:before, *:after { + -webkit-box-sizing: inherit; + box-sizing: inherit; +} + +*, body, html { + padding: 0; + margin: 0; +} + +#chat, a, body, html { + color: white; +} + +body, html { + -webkit-font-smoothing: antialiased; + overflow: hidden; + font-size: 14px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + font-size: calc(.75em + .3vw); + font-weight: 500; + direction: ltr; +} + +a { + text-decoration: none; +} + +.ui_element { + display: none; + position: absolute; + width: 100vw; + height: 100vh; + z-index: 2; +} + +#chat { + display: block; + z-index: 0; + line-height: 1.25; + text-shadow: 1px 1px 0 #000,-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000; + letter-spacing: .4px; + margin-top: 1em; + margin-left: 1em; +} + +#chat ul#chat_messages { + height: 16.45em; + min-width: 50ch; + max-width: calc(45vw + 10px); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + overflow-y: auto; + overflow-x: hidden; + word-break: break-all; + list-style-type: none; + margin-bottom: .25em; +} + +#chat ul#chat_messages > li { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + margin-bottom: .125em; +} + +#chat ul#chat_messages > li:last-child { + margin-bottom: .25em; +} + +#chat input#chat_msg { + width: 45vw; + outline: 0; + border: none; + border-radius: 3px; + font-family: inherit; + font-size: inherit; + font-weight: inherit; + line-height: 1; + color: white; + background: rgba(0, 0, 0, 0.5); + padding: .25em .5em .5em; +} + +::-webkit-scrollbar { + width: 10px; +} + +::-webkit-scrollbar-thumb { + background: rgba(255, 17, 0, 0); + border-radius: 3px; +} + +::-webkit-scrollbar-thumb:hover { + background: rgba(255, 17, 0, 0); +} +/*# sourceMappingURL=main.css.map */ \ No newline at end of file diff --git a/ReallifeGamemode.Client/assets/css/chat/main.css.map b/ReallifeGamemode.Client/assets/css/chat/main.css.map new file mode 100644 index 00000000..7f240a1f --- /dev/null +++ b/ReallifeGamemode.Client/assets/css/chat/main.css.map @@ -0,0 +1,9 @@ +{ + "version": 3, + "mappings": "AAAA,AAAA,IAAI,CAAC;EAAE,UAAU,EAAE,UAAU;CAAI;;AACjC,AAAA,CAAC,EAAE,CAAC,AAAA,OAAO,EAAE,CAAC,AAAA,MAAM,CAAC;EAAE,UAAU,EAAE,OAAO;CAAI;;AAG9C,AAAA,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;EACZ,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CACV;CAAC;;AAED,AAAA,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;EAAE,KAAK,EAAE,KAAK;CAAI;;AAEvC,AAAA,IAAI,EAAE,IAAI,CAAC;EACT,sBAAsB,EAAE,WAAW;EACnC,QAAQ,EAAE,MAAM;EAChB,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,IAAI;CAClB;;AAED,AAAA,IAAI,CAAC;EACH,WAAW,EAAE,oIAAoI;EACjJ,SAAS,EAAE,kBAAkB;EAC7B,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,GAAG;CACf;;AAED,AAAA,CAAC,CAAC;EAAE,eAAe,EAAE,IAAI;CAAI;;AAE7B,AAAA,WAAW,CAAC;EACV,OAAO,EAAE,IAAI;EACb,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,KAAK;EACb,OAAO,EAAE,CACX;CAAC;;AAED,AAAA,KAAK,CAAC;EACJ,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,CAAC;EAEV,WAAW,EAAE,IAAI;EACjB,WAAW,EAAE,8EAA8E;EAC3F,cAAc,EAAE,IAAI;EAEpB,UAAU,EAAE,GAAG;EACf,WAAW,EAAE,GAAG;CAuCjB;;AAhDD,AAWE,KAXG,CAWH,EAAE,AAAA,cAAc,CAAC;EACf,MAAM,EAAE,OAAO;EACf,SAAS,EAAE,IAAI;EACf,SAAS,EAAE,iBAAiB;EAC5B,SAAS,EAAE,YAAY;EAEvB,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,SAAS;EAErB,eAAe,EAAE,IAAI;EACrB,aAAa,EAAE,KAAK;CAQrB;;AA9BH,AAwBI,KAxBC,CAWH,EAAE,AAAA,cAAc,GAaX,EAAE,CAAC;EACJ,SAAS,EAAE,YAAY;EACvB,aAAa,EAAE,MAAM;CAGtB;;AA7BL,AA4BM,KA5BD,CAWH,EAAE,AAAA,cAAc,GAaX,EAAE,AAIF,WAAW,CAAC;EAAE,aAAa,EAAE,KAAK;CAAI;;AA5B7C,AAgCE,KAhCG,CAgCH,KAAK,AAAA,SAAS,CAAC;EACb,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAElB,WAAW,EAAE,OAAO;EACpB,SAAS,EAAE,OAAO;EAClB,WAAW,EAAE,OAAO;EACpB,WAAW,EAAE,CAAC;EAEd,KAAK,EAAE,KAAK;EACZ,UAAU,EAAE,kBAAiB;EAE7B,OAAO,EAAE,eAAe;CACzB;;AAGH,AAAA,mBAAmB,CAAC;EAClB,KAAK,EAAE,IAAI;CAQZ;;AATD,AAGE,mBAHiB,AAGhB,MAAM,CAAC;EACN,UAAU,EAAE,mBAAmB;EAC/B,aAAa,EAAE,GAAG;CAGnB;;AARH,AAOI,mBAPe,AAGhB,MAAM,AAIJ,MAAM,CAAC;EAAE,UAAU,EAAE,mBAAmB;CAAI", + "sources": [ + "main.scss" + ], + "names": [], + "file": "main.css" +} \ No newline at end of file diff --git a/ReallifeGamemode.Client/assets/css/chat/main.scss b/ReallifeGamemode.Client/assets/css/chat/main.scss new file mode 100644 index 00000000..b0de6970 --- /dev/null +++ b/ReallifeGamemode.Client/assets/css/chat/main.scss @@ -0,0 +1,95 @@ +html { box-sizing: border-box; } +*, *:before, *:after { box-sizing: inherit; } + + +*, body, html { + padding: 0; + margin: 0 +} + +#chat, a, body, html { color: white; } + +body, html { + -webkit-font-smoothing: antialiased; + overflow: hidden; + font-size: 14px; + user-select: none; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + font-size: calc(.75em + .3vw); + font-weight: 500; + direction: ltr; +} + +a { text-decoration: none; } + +.ui_element { + display: none; + position: absolute; + width: 100vw; + height: 100vh; + z-index: 2 +} + +#chat { + display: block; + z-index: 0; + + line-height: 1.25; + text-shadow: 1px 1px 0 #000,-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000; + letter-spacing: .4px; + + margin-top: 1em; + margin-left: 1em; + + ul#chat_messages { + height: 16.45em; + min-width: 50ch; + max-width: calc(45vw + 10px); + transform: rotate(0deg); + + overflow-y: auto; + overflow-x: hidden; + word-break: break-all; + + list-style-type: none; + margin-bottom: .25em; + + &> li { + transform: rotate(0deg); + margin-bottom: .125em; + + &:last-child { margin-bottom: .25em; } + } + } + + input#chat_msg { + width: 45vw; + outline: 0; + border: none; + border-radius: 3px; + + font-family: inherit; + font-size: inherit; + font-weight: inherit; + line-height: 1; + + color: white; + background: rgba(0, 0, 0, .5); + + padding: .25em .5em .5em; + } +} + +::-webkit-scrollbar { + width: 10px; + + &-thumb { + background: rgba(255, 17, 0, 0); + border-radius: 3px; + + &:hover { background: rgba(255, 17, 0, 0); } + } +} diff --git a/ReallifeGamemode.Client/assets/chat/style/main.css b/ReallifeGamemode.Client/assets/css/chat/main_old.css similarity index 100% rename from ReallifeGamemode.Client/assets/chat/style/main.css rename to ReallifeGamemode.Client/assets/css/chat/main_old.css diff --git a/ReallifeGamemode.Client/assets/css/inputhelper/style.css b/ReallifeGamemode.Client/assets/css/inputhelper/style.css index 830931f3..5f9b84a8 100644 --- a/ReallifeGamemode.Client/assets/css/inputhelper/style.css +++ b/ReallifeGamemode.Client/assets/css/inputhelper/style.css @@ -1,122 +1,138 @@ html { - -webkit-box-sizing: border-box; - box-sizing: border-box; - user-select: none; + -webkit-box-sizing: border-box; + box-sizing: border-box; + user-select: none; } *, *::before, *::after { - -webkit-box-sizing: inherit; - box-sizing: inherit; + -webkit-box-sizing: inherit; + box-sizing: inherit; } body { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - height: 100vh; - width: -webkit-fit-content; - width: -moz-fit-content; - width: fit-content; - margin: 0 auto; - padding: 1em .5em; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; - font-weight: 400; - color: #FFF; - + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + height: 100vh; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + margin: 0 auto; + padding: 1em .5em; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + font-weight: 400; + color: #FFF; } main { - height: auto; - position: relative; - min-width: 50ch; - max-width: 35vw; - padding: 1em; - border-radius: .25em; - font-size: 1em; - line-height: 1.25; - background-color: rgba(0, 0, 0, 0.5); - + height: auto; + max-height: 60vh; + position: relative; + min-width: 45ch; + max-width: 30vw; + padding: 1em; + border-radius: .25em; + font-size: 1em; + line-height: 1.25; + background-color: rgba(0, 0, 0, 0.5); } - main a#close { - position: absolute; - right: 1em; - top: 1em; - height: 1em; - width: 1em; - opacity: 0.25; - + main a#close { + position: absolute; + right: 1em; + top: 1em; + height: 1em; + width: 1em; + opacity: 0.25; + } + + main a#close:hover { + opacity: 1; } - main a#close:hover { - opacity: 1; - } - - main a#close:before, main a#close:after { - content: ' '; - position: absolute; - left: .5em; - height: 1em; - width: 2px; - background-color: #FFF; - border-radius: 1px; - } - - main a#close:before { - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - } - - main a#close:after { - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - } - - main h1, main p { - margin: 0; + main a#close:before, main a#close:after { + content: ' '; + position: absolute; + left: .5em; + height: 1em; + width: 2px; + background-color: #FFF; + border-radius: 1px; } - main h1 { - font-size: 1.5em; - line-height: 1; - margin-bottom: .125em; - padding-right: 1em; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; + main a#close:before { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); } - main p { - margin-bottom: 1em; - line-height: 1.125; + main a#close:after { + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); } - main .form { - margin-top: .25em; + main h1, main p { + margin: 0; + } + + main h1 { + font-size: 1.5em; + line-height: 1.125; + margin-bottom: .25em; + padding-right: 1em; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + main p { + margin-bottom: .5em; + line-height: 1.125; + max-height: 12em; + overflow-y: auto; + padding-right: .5em; + word-break: break-word; + } + + main p::-webkit-scrollbar { + width: 5px; + } + + main p::-webkit-scrollbar-track { + background-color: rgba(0, 0, 0, .125); + border-radius: 3px; + } + + main p::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, .125); + border-radius: 3px; + } + + main .form { + margin-top: .25em; + } + + main .form input { + width: 100%; + padding: .5em; + font-family: "Roboto Mono"; + font-weight: 500; + font-size: 1em; + border: none; + border-radius: 5px; + background-color: rgba(0, 0, 0, 0.125); + color: inherit; } - main .form input { - width: 100%; - padding: .5em; - font-family: "Roboto Mono"; - font-weight: 500; - font-size: 1em; - border: none; - border-radius: 5px; - background-color: rgba(0, 0, 0, 0.125); - color: inherit; - } - - main .form input:focus { - outline-width: 0; - } + main .form input:focus { + outline-width: 0; + } diff --git a/ReallifeGamemode.Client/assets/css/onlinelist/style.css b/ReallifeGamemode.Client/assets/css/onlinelist/style.css index 28dd56ed..d74093be 100644 --- a/ReallifeGamemode.Client/assets/css/onlinelist/style.css +++ b/ReallifeGamemode.Client/assets/css/onlinelist/style.css @@ -19,8 +19,8 @@ html, body { } body { - margin: 15vh auto 0; - width: 32vw; + margin: 10vh auto 0; + width: 35vw; color: white; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 1em; @@ -49,13 +49,23 @@ h2 { -webkit-box-align: start; -ms-flex-align: start; align-items: flex-start; - margin-bottom: 1.5em; + margin-bottom: 1em; padding: 1em 1em 0; } +.factions { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 3; + font-size: .9em; + background-color: #222; + padding: 1em 0; +} + .wrapper { - min-height: 50vh; - max-height: 70vh; + min-height: 60vh; + max-height: 80vh; overflow-y: scroll; border-radius: .25em; background-color: rgba(0, 0, 0, 0.75); @@ -74,10 +84,10 @@ table { table th { position: -webkit-sticky; position: sticky; - top: 0; + top: 3em; text-align: left; z-index: 2; - background-color: black; + background-color: #222; } table th:first-child { @@ -203,19 +213,7 @@ ol.inline.stats { justify-content: center; } -ol.inline.stats:first-of-type { - margin-top: 1em !important; -} - -ol.inline.stats:last-of-type { - margin-bottom: 1em; -} - -ol.inline.stats:not(:last-of-type) { - margin-bottom: .125em; -} - ol.inline.stats abbr { text-decoration: none; } -/*# sourceMappingURL=style.css.map */ \ No newline at end of file +/*# sourceMappingURL=style.css.map */ diff --git a/ReallifeGamemode.Client/assets/css/onlinelist/style.css.map b/ReallifeGamemode.Client/assets/css/onlinelist/style.css.map index 74b823b9..ad1da382 100644 --- a/ReallifeGamemode.Client/assets/css/onlinelist/style.css.map +++ b/ReallifeGamemode.Client/assets/css/onlinelist/style.css.map @@ -1,6 +1,6 @@ { "version": 3, - "mappings": "AAAA,AAAA,IAAI,CAAC;EACH,UAAU,EAAE,UAAU;EACtB,MAAM,EAAE,KAAK;EACb,UAAU,EAAE,WAAW;EACvB,WAAW,EAAE,IAAI;CAClB;;AAED,AAAA,IAAI,EAAE,IAAI,CAAC;EAAE,MAAM,EAAE,KAAK;CAAI;;AAC9B,AAAA,CAAC,EAAE,CAAC,AAAA,OAAO,EAAE,CAAC,AAAA,MAAM,CAAC;EAAE,UAAU,EAAE,OAAO;CAAI;;AAE9C,AAAA,IAAI,CAAC;EACH,MAAM,EAAE,WAAW;EAEnB,KAAK,EAAE,IAAI;EACX,KAAK,EAAE,KAAK;EAEZ,WAAW,EAAE,oIAAoI;EACjJ,SAAS,EAAE,GAAG;CACf;;AAED,AAAA,EAAE,EAAE,EAAE,CAAC;EACL,MAAM,EAAE,KAAK;EACb,WAAW,EAAE,CAAC;CACf;;AAED,AAAA,EAAE,CAAC;EAAE,SAAS,EAAE,MAAM;CAAI;;AAC1B,AAAA,EAAE,CAAC;EAAE,SAAS,EAAE,OAAO;CAAI;;AAE3B,AAAA,QAAQ,CAAC;EACP,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,aAAa;EAC9B,WAAW,EAAE,UAAU;EACvB,aAAa,EAAE,KAAK;EACpB,OAAO,EAAE,SAAS;CACnB;;AAED,AAAA,QAAQ,CAAC;EACP,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,MAAM;EAElB,aAAa,EAAE,KAAK;EACpB,gBAAgB,EAAE,mBAAkB;CAGrC;;AATD,AAQE,QARM,AAQL,mBAAmB,CAAC;EAAE,OAAO,EAAE,IAAI;CAAI;;AAG1C,AAAA,KAAK,CAAC;EACJ,eAAe,EAAE,QAAQ;EACzB,KAAK,EAAE,IAAI;EACX,aAAa,EAAE,OAAO;CAwCvB;;AA3CD,AAKE,KALG,CAKH,EAAE,CAAC;EACD,QAAQ,EAAE,MAAM;EAChB,GAAG,EAAE,CAAC;EACN,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,CAAC;EAEV,gBAAgB,EAAE,KAAK;CAIxB;;AAfH,AAaI,KAbC,CAKH,EAAE,AAQC,YAAY,CAAC;EAAE,sBAAsB,EAAE,KAAK;CAAI;;AAbrD,AAcI,KAdC,CAKH,EAAE,AASC,WAAW,CAAC;EAAE,uBAAuB,EAAE,KAAK;CAAI;;AAdrD,AAiBE,KAjBG,CAiBH,EAAE,EAjBJ,KAAK,CAiBC,EAAE,CAAC;EACL,OAAO,EAAE,SAAS;CAInB;;AAtBH,AAoBI,KApBC,CAiBH,EAAE,AAGC,YAAY,EApBjB,KAAK,CAiBC,EAAE,AAGH,YAAY,CAAC;EAAE,YAAY,EAAE,GAAG;CAAI;;AApBzC,AAqBI,KArBC,CAiBH,EAAE,AAIC,WAAW,EArBhB,KAAK,CAiBC,EAAE,AAIH,WAAW,CAAC;EAAE,aAAa,EAAE,GAAG;CAAI;;AArBzC,AAyBI,KAzBC,CAwBH,EAAE,CACA,EAAE,CAAC;EACD,QAAQ,EAAE,MAAM;CAajB;;AAvCL,AA4BM,KA5BD,CAwBH,EAAE,CACA,EAAE,AAGC,UAAW,CAAA,CAAC,EAAE;EAAE,KAAK,EAAE,cAAc;CAAI;;AA5BhD,AA6BM,KA7BD,CAwBH,EAAE,CACA,EAAE,AAIC,UAAW,CAAA,CAAC,EAAE;EACb,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,IAAI;EACjB,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,MAAM;CAGpB;;AApCP,AAmCQ,KAnCH,CAwBH,EAAE,CACA,EAAE,AAIC,UAAW,CAAA,CAAC,CAMV,mBAAmB,CAAC;EAAE,OAAO,EAAE,IAAI;CAAI;;AAnChD,AAqCM,KArCD,CAwBH,EAAE,CACA,EAAE,AAYC,UAAW,CAAA,CAAC,EAAE;EAAE,KAAK,EAAE,eAAe;CAAI;;AArCjD,AAsCM,KAtCD,CAwBH,EAAE,CACA,EAAE,AAaC,UAAW,CAAA,CAAC,EAAE;EAAE,KAAK,EAAE,eAAe;CAAI;;AAtCjD,AAyCI,KAzCC,CAwBH,EAAE,AAiBC,UAAW,CAAA,IAAI,EAAE;EAAE,gBAAgB,EAAE,mBAAkB;CAAI;;AAIhE,AACE,MADI,AACH,QAAQ,CAAC;EACR,OAAO,EAAE,EAAE;EACX,MAAM,EAAE,KAAK;EACb,KAAK,EAAE,KAAK;EACZ,aAAa,EAAE,GAAG;EAClB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,OAAO;EACd,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,0BAA0B;EAE5C,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,GAAG;CACnB;;AAEA,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,KAAkB;CAAI;;AACtD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,OAAe;CAAI;;AACnD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,OAAc;CAAI;;AAClD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,OAAc;CAAI;;AAClD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,OAAgB;CAAI;;AACpD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,OAAgB;CAAI;;AACpD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,KAAkB;CAAI;;AACtD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,OAAa;CAAI;;AACjD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,OAAgB;CAAI;;AACpD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,OAAgB;CAAI;;AAGvD,AAAA,EAAE,AAAA,OAAO,CAAC;EACR,OAAO,EAAE,IAAI;EAEb,UAAU,EAAE,KAAK;EACjB,eAAe,EAAE,IAAI;EACrB,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,KAAK;CAGf;;AATD,AAQE,EARA,AAAA,OAAO,CAQP,EAAE,AAAA,IAAK,CAAA,WAAW,EAAE;EAAE,YAAY,EAAE,GAAG;CAAI;;AAG7C,AAAA,EAAE,AAAA,OAAO,AAAA,MAAM,CAAC;EACd,eAAe,EAAE,MAAM;CAOxB;;AARD,AAGE,EAHA,AAAA,OAAO,AAAA,MAAM,AAGZ,cAAc,CAAC;EAAE,UAAU,EAAE,cAAc;CAAI;;AAHlD,AAIE,EAJA,AAAA,OAAO,AAAA,MAAM,AAIZ,aAAa,CAAC;EAAE,aAAa,EAAE,GAAG;CAAI;;AAJzC,AAKE,EALA,AAAA,OAAO,AAAA,MAAM,AAKZ,IAAK,CAAA,aAAa,EAAE;EAAE,aAAa,EAAE,MAAM;CAAI;;AALlD,AAOE,EAPA,AAAA,OAAO,AAAA,MAAM,CAOb,IAAI,CAAC;EAAE,eAAe,EAAE,IAAI;CAAI", + "mappings": "AAAA,AAAA,IAAI,CAAC;EACH,UAAU,EAAE,UAAU;EACtB,MAAM,EAAE,KAAK;EACb,UAAU,EAAE,WAAW;EACvB,WAAW,EAAE,IAAI;CAClB;;AAED,AAAA,IAAI,EAAE,IAAI,CAAC;EAAE,MAAM,EAAE,KAAK;CAAI;;AAC9B,AAAA,CAAC,EAAE,CAAC,AAAA,OAAO,EAAE,CAAC,AAAA,MAAM,CAAC;EAAE,UAAU,EAAE,OAAO;CAAI;;AAE9C,AAAA,IAAI,CAAC;EACH,MAAM,EAAE,WAAW;EAEnB,KAAK,EAAE,IAAI;EACX,KAAK,EAAE,KAAK;EAEZ,WAAW,EAAE,oIAAoI;EACjJ,SAAS,EAAE,GAAG;CACf;;AAED,AAAA,EAAE,EAAE,EAAE,CAAC;EACL,MAAM,EAAE,KAAK;EACb,WAAW,EAAE,CAAC;CACf;;AAED,AAAA,EAAE,CAAC;EAAE,SAAS,EAAE,MAAM;CAAI;;AAC1B,AAAA,EAAE,CAAC;EAAE,SAAS,EAAE,OAAO;CAAI;;AAE3B,AAAA,QAAQ,CAAC;EACP,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,aAAa;EAC9B,WAAW,EAAE,UAAU;EACvB,aAAa,EAAE,GAAG;EAClB,OAAO,EAAE,SAAS;CACnB;;AAED,AAAA,SAAS,CAAC;EACR,QAAQ,EAAE,MAAM;EAChB,GAAG,EAAE,CAAC;EACN,OAAO,EAAE,CAAC;EAEV,SAAS,EAAE,IAAI;EACf,gBAAgB,EAAE,IAAI;EAEtB,OAAO,EAAE,KAAK;CACf;;AAED,AAAA,QAAQ,CAAC;EACP,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,MAAM;EAElB,aAAa,EAAE,KAAK;EACpB,gBAAgB,EAAO,mBAAK;CAG7B;;AATD,AAQE,QARM,AAQL,mBAAmB,CAAC;EAAE,OAAO,EAAE,IAAI;CAAI;;AAG1C,AAAA,KAAK,CAAC;EACJ,eAAe,EAAE,QAAQ;EACzB,KAAK,EAAE,IAAI;EACX,aAAa,EAAE,OAAO;CAwCvB;;AA3CD,AAKE,KALG,CAKH,EAAE,CAAC;EACD,QAAQ,EAAE,MAAM;EAChB,GAAG,EAAE,GAAG;EACR,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,CAAC;EAEV,gBAAgB,EAAE,IAAI;CAIvB;;AAfH,AAaI,KAbC,CAKH,EAAE,AAQC,YAAY,CAAC;EAAE,sBAAsB,EAAE,KAAK;CAAI;;AAbrD,AAcI,KAdC,CAKH,EAAE,AASC,WAAW,CAAC;EAAE,uBAAuB,EAAE,KAAK;CAAI;;AAdrD,AAiBE,KAjBG,CAiBH,EAAE,EAjBJ,KAAK,CAiBC,EAAE,CAAC;EACL,OAAO,EAAE,SAAS;CAInB;;AAtBH,AAoBI,KApBC,CAiBH,EAAE,AAGC,YAAY,EApBjB,KAAK,CAiBC,EAAE,AAGH,YAAY,CAAC;EAAE,YAAY,EAAE,GAAG;CAAI;;AApBzC,AAqBI,KArBC,CAiBH,EAAE,AAIC,WAAW,EArBhB,KAAK,CAiBC,EAAE,AAIH,WAAW,CAAC;EAAE,aAAa,EAAE,GAAG;CAAI;;AArBzC,AAyBI,KAzBC,CAwBH,EAAE,CACA,EAAE,CAAC;EACD,QAAQ,EAAE,MAAM;CAajB;;AAvCL,AA4BM,KA5BD,CAwBH,EAAE,CACA,EAAE,AAGC,UAAW,CAAA,CAAC,EAAE;EAAE,KAAK,EAAE,cAAc;CAAI;;AA5BhD,AA6BM,KA7BD,CAwBH,EAAE,CACA,EAAE,AAIC,UAAW,CAAA,CAAC,EAAE;EACb,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,IAAI;EACjB,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,MAAM;CAGpB;;AApCP,AAmCQ,KAnCH,CAwBH,EAAE,CACA,EAAE,AAIC,UAAW,CAAA,CAAC,CAMV,mBAAmB,CAAC;EAAE,OAAO,EAAE,IAAI;CAAI;;AAnChD,AAqCM,KArCD,CAwBH,EAAE,CACA,EAAE,AAYC,UAAW,CAAA,CAAC,EAAE;EAAE,KAAK,EAAE,eAAe;CAAI;;AArCjD,AAsCM,KAtCD,CAwBH,EAAE,CACA,EAAE,AAaC,UAAW,CAAA,CAAC,EAAE;EAAE,KAAK,EAAE,eAAe;CAAI;;AAtCjD,AAyCI,KAzCC,CAwBH,EAAE,AAiBC,UAAW,CAAA,IAAI,EAAE;EAAE,gBAAgB,EAAE,mBAAkB;CAAI;;AAIhE,AACE,MADI,AACH,QAAQ,CAAC;EACR,OAAO,EAAE,EAAE;EACX,MAAM,EAAE,KAAK;EACb,KAAK,EAAE,KAAK;EACZ,aAAa,EAAE,GAAG;EAClB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,OAAO;EACd,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,0BAA0B;EAE5C,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,GAAG;CACnB;;AAEA,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,KAAkB;CAAI;;AACtD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,OAAe;CAAI;;AACnD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,OAAc;CAAI;;AAClD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,OAAc;CAAI;;AAClD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,OAAgB;CAAI;;AACpD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,OAAgB;CAAI;;AACpD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,KAAkB;CAAI;;AACtD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,OAAa;CAAI;;AACjD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,OAAgB;CAAI;;AACpD,AAAD,SAAI,AAAA,QAAQ,CAAC;EAAE,gBAAgB,EAAE,OAAgB;CAAI;;AAGvD,AAAA,EAAE,AAAA,OAAO,CAAC;EACR,OAAO,EAAE,IAAI;EAEb,UAAU,EAAE,KAAK;EACjB,eAAe,EAAE,IAAI;EACrB,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,KAAK;CAGf;;AATD,AAQE,EARA,AAAA,OAAO,CAQP,EAAE,AAAA,IAAK,CAAA,WAAW,EAAE;EAAE,YAAY,EAAE,GAAG;CAAI;;AAG7C,AAAA,EAAE,AAAA,OAAO,AAAA,MAAM,CAAC;EACd,eAAe,EAAE,MAAM;CAGxB;;AAJD,AAGE,EAHA,AAAA,OAAO,AAAA,MAAM,CAGb,IAAI,CAAC;EAAE,eAAe,EAAE,IAAI;CAAI", "sources": [ "style.scss" ], diff --git a/ReallifeGamemode.Client/assets/css/onlinelist/style.scss b/ReallifeGamemode.Client/assets/css/onlinelist/style.scss index 6486aa77..a88100de 100644 --- a/ReallifeGamemode.Client/assets/css/onlinelist/style.scss +++ b/ReallifeGamemode.Client/assets/css/onlinelist/style.scss @@ -9,9 +9,9 @@ html, body { margin: unset; } *, *:before, *:after { box-sizing: inherit; } body { - margin: 15vh auto 0; + margin: 10vh auto 0; - width: 32vw; + width: 35vw; color: white; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; @@ -30,17 +30,28 @@ h2 { font-size: 1.125em; } display: flex; justify-content: space-between; align-items: flex-start; - margin-bottom: 1.5em; + margin-bottom: 1em; padding: 1em 1em 0; } +.factions { + position: sticky; + top: 0; + z-index: 3; + + font-size: .9em; + background-color: #222; + + padding: 1em 0; +} + .wrapper { - min-height: 50vh; - max-height: 70vh; + min-height: 60vh; + max-height: 80vh; overflow-y: scroll; border-radius: .25em; - background-color: rgba(0, 0, 0, .75); + background-color: rgba(black, .75); &::-webkit-scrollbar { display: none; } } @@ -52,11 +63,11 @@ table { th { position: sticky; - top: 0; + top: 3em; text-align: left; z-index: 2; - background-color: black; + background-color: #222; &:first-child { border-top-left-radius: .25em; } &:last-child { border-top-right-radius: .25em; } @@ -129,10 +140,6 @@ ol.inline { ol.inline.stats { justify-content: center; - - &:first-of-type { margin-top: 1em !important; } - &:last-of-type { margin-bottom: 1em; } - &:not(:last-of-type) { margin-bottom: .125em; } abbr { text-decoration: none; } -} +} \ No newline at end of file diff --git a/ReallifeGamemode.Client/assets/chat/fonts/CenturyGothicRegular.ttf b/ReallifeGamemode.Client/assets/font/chat/CenturyGothicRegular.ttf similarity index 100% rename from ReallifeGamemode.Client/assets/chat/fonts/CenturyGothicRegular.ttf rename to ReallifeGamemode.Client/assets/font/chat/CenturyGothicRegular.ttf diff --git a/ReallifeGamemode.Client/assets/chat/fonts/CodeProLC.otf b/ReallifeGamemode.Client/assets/font/chat/CodeProLC.otf similarity index 100% rename from ReallifeGamemode.Client/assets/chat/fonts/CodeProLC.otf rename to ReallifeGamemode.Client/assets/font/chat/CodeProLC.otf diff --git a/ReallifeGamemode.Client/assets/chat/fonts/emoji_unicode.php b/ReallifeGamemode.Client/assets/font/chat/emoji_unicode.php similarity index 100% rename from ReallifeGamemode.Client/assets/chat/fonts/emoji_unicode.php rename to ReallifeGamemode.Client/assets/font/chat/emoji_unicode.php diff --git a/ReallifeGamemode.Client/assets/html/chat/index.html b/ReallifeGamemode.Client/assets/html/chat/index.html new file mode 100644 index 00000000..655c409d --- /dev/null +++ b/ReallifeGamemode.Client/assets/html/chat/index.html @@ -0,0 +1,16 @@ + + + + + + + + +
+ +
+ + + + + \ No newline at end of file diff --git a/ReallifeGamemode.Client/assets/html/inputhelper/index.html b/ReallifeGamemode.Client/assets/html/inputhelper/index.html index f3247c4b..335e30f4 100644 --- a/ReallifeGamemode.Client/assets/html/inputhelper/index.html +++ b/ReallifeGamemode.Client/assets/html/inputhelper/index.html @@ -1,4 +1,4 @@ - + @@ -6,22 +6,25 @@ Eingabe | Life of German - - - + + +
-

+

{{ Überschrift }}

+ +

+
- +
- - \ No newline at end of file + diff --git a/ReallifeGamemode.Client/assets/html/onlinelist/index.html b/ReallifeGamemode.Client/assets/html/onlinelist/index.html index 84fe2a70..5e54c6d3 100644 --- a/ReallifeGamemode.Client/assets/html/onlinelist/index.html +++ b/ReallifeGamemode.Client/assets/html/onlinelist/index.html @@ -5,7 +5,7 @@ Spielerliste - +
@@ -14,6 +14,21 @@

Spieler: 0

+
+
    +
  1. LSPD: 0
  2. +
  3. FIB: 0
  4. +
  5. LSED: 0
  6. + +
  7. GSF: 0
  8. +
  9. FYB: 0
  10. +
  11. LSV: 0
  12. + +
  13. WZN: 0
  14. +
  15. ZIVI: 0
  16. +
+
+ @@ -27,26 +42,8 @@
- -
    -
  1. LSPD: 0
  2. -
  3. FIB: 0
  4. -
  5. LSED: 0
  6. -
- -
    -
  1. GSF: 0
  2. -
  3. FYB: 0
  4. -
  5. LSV: 0
  6. -
- -
    -
  1. WZN: 0
  2. -
  3. Zivilisten: 0
  4. -
- - - + + diff --git a/ReallifeGamemode.Client/assets/chat/jquery-1.11.3.min.js b/ReallifeGamemode.Client/assets/js/chat/jquery-1.11.3.min.js similarity index 100% rename from ReallifeGamemode.Client/assets/chat/jquery-1.11.3.min.js rename to ReallifeGamemode.Client/assets/js/chat/jquery-1.11.3.min.js diff --git a/ReallifeGamemode.Client/assets/chat/js/main.js b/ReallifeGamemode.Client/assets/js/chat/main.js similarity index 99% rename from ReallifeGamemode.Client/assets/chat/js/main.js rename to ReallifeGamemode.Client/assets/js/chat/main.js index fe051878..f9ebd0aa 100644 --- a/ReallifeGamemode.Client/assets/chat/js/main.js +++ b/ReallifeGamemode.Client/assets/js/chat/main.js @@ -1,4 +1,4 @@ -let chat = +let chat = { size: 0, history_limit: 50, @@ -185,4 +185,4 @@ $(document).ready(function () { enableChatInput(false); } }); -}); \ No newline at end of file +}); diff --git a/ReallifeGamemode.Client/assets/chat/js/newMain.js b/ReallifeGamemode.Client/assets/js/chat/newMain.js similarity index 100% rename from ReallifeGamemode.Client/assets/chat/js/newMain.js rename to ReallifeGamemode.Client/assets/js/chat/newMain.js diff --git a/ReallifeGamemode.Client/assets/js/inputhelper/application.js b/ReallifeGamemode.Client/assets/js/inputhelper/application.js index 8513019d..5f37fd1e 100644 --- a/ReallifeGamemode.Client/assets/js/inputhelper/application.js +++ b/ReallifeGamemode.Client/assets/js/inputhelper/application.js @@ -1,4 +1,4 @@ -let content = document.getElementById('content'); +let content = document.getElementById('content'); let heading = document.getElementById('heading'); let description = document.getElementById('description'); @@ -6,7 +6,7 @@ let description = document.getElementById('description'); let input = document.getElementById('input'); let close = document.getElementById('close'); -fzunction setInputFieldType(value) { +function setInputFieldType(value) { if (input.type == value) return; var field = document.createElement('input'); @@ -21,7 +21,6 @@ fzunction setInputFieldType(value) { return field; } - function setText(heading, description) { setHeading(heading); setDescription(description); @@ -53,9 +52,6 @@ close.onclick = function closeWindow() { console.log('Fenster geschlossen!'); } -setInputFieldType('text'); -setText("Überschrift", "Lorem ipsum dolor sit amet consectetur adipisicing elit. Maiores laboriosam atque ut voluptates molestiae ab autem? Est consectetur voluptatem quia, commodi sint a omnis consequuntur. Tempora dolores ullam natus in?"); - /* Enter wird im Input-Feld gedrückt */ input.onkeyup = e => { let code = e.keyCode ? e.keyCode : e.which; @@ -72,3 +68,4 @@ document.onkeyup = e => { } close.onclick = e => { closeWindow(); } +setInputFieldType('text'); diff --git a/ReallifeGamemode.Client/assets/js/onlinelist/script.js b/ReallifeGamemode.Client/assets/js/onlinelist/script.js index c9b9e2b9..a662711b 100644 --- a/ReallifeGamemode.Client/assets/js/onlinelist/script.js +++ b/ReallifeGamemode.Client/assets/js/onlinelist/script.js @@ -1,12 +1,9 @@ window.onbeforeunload = () => { window.scrollTo(0, 0); } -$(document).ready(function () { - mp.trigger('CEF:PlayerList_Loaded'); -}); - setPlayerCount = (factionId, value) => { if (factionId == -1) { document.getElementById('player-count').innerHTML = value; + addTableSorting(); } else if (factionId >= 0 && factionId <= 9) { document.getElementById(factionId).innerHTML = value; } @@ -21,7 +18,7 @@ function getFactionNameByFactionId(factionId) { case 5: return "Vagos"; case 7: return "Grove Street"; case 8: return "Ballas"; - case 9: return "Weazle News"; + case 9: return "Weazel News"; default: return "Zivilisten"; } } @@ -30,3 +27,34 @@ function addPlayerEntry(userId, userName, factionId, userPing) { var factionName = getFactionNameByFactionId(factionId); document.getElementById('players').innerHTML += `${userId} ${userName} ${factionName} ${userPing}`; } + +// https://www.jstips.co/en/javascript/detect-document-ready-in-pure-js/ +document.onreadystatechange = () => { + if (document.readyState === 'complete') { mp.trigger('CEF:PlayerList_Loaded'); } +}; + +// Sortierung von https://codepen.io/selbekk/pen/LNOZKL +function addTableSorting() { + const headers = Array.from(document.querySelectorAll('th')); + const rows = Array.from(document.querySelectorAll('tbody tr')); + + function sort(e) { + const index = headers.indexOf(e.target); + const sortVal = e.target.classList.contains('is-asc') ? 1 : -1; + rows.sort((a, b) => { + const aValue = a.children[index].innerHTML; + const bValue = b.children[index].innerHTML; + if(aValue > bValue) { return sortVal; } + if(aValue < bValue) { return -sortVal; } + return 0; + }) + + e.target.classList.add('is-sorted'); + e.target.classList.toggle('is-asc'); + const body = document.querySelector('tbody'); + body.innerHTML = ''; + rows.forEach(row => body.appendChild(row)); + } + + headers.forEach(header => header.addEventListener('click', sort)); +} diff --git a/ReallifeGamemode.Client/coloredhlights/index.ts b/ReallifeGamemode.Client/coloredhlights/index.ts index bfafcab5..97f95dc1 100644 --- a/ReallifeGamemode.Client/coloredhlights/index.ts +++ b/ReallifeGamemode.Client/coloredhlights/index.ts @@ -1,4 +1,4 @@ -export default function coloredHeadLights() { +export default function coloredHeadLights() { function setHeadlightsColor(vehicle, color) { if (typeof color !== "number" || isNaN(color) || color < 0 || color === 255) { // Disable diff --git a/ReallifeGamemode.Client/core/rage-mp/entities.ts b/ReallifeGamemode.Client/core/rage-mp/entities.ts index 9073acc4..2a855054 100644 --- a/ReallifeGamemode.Client/core/rage-mp/entities.ts +++ b/ReallifeGamemode.Client/core/rage-mp/entities.ts @@ -147,7 +147,7 @@ class RageEntityAttachmentPool implements IEntityAttachmentPool { let e = new RageAttachments(entity, attachments, attachmentObjects); this.attachmentPool.push(e); - return e; + return e; } at(remoteId: any): IEntityAttachments { @@ -188,6 +188,10 @@ class RagePlayerPool implements IPlayerPool { fn(new RagePlayer(e)); }); } + + exists(entity: IPlayer): boolean { + return mp.players.exists(entity.id); + } } @@ -280,6 +284,10 @@ class RageVehiclePool implements IVehiclePool { fn(new RageVehicle(e)); }) } + + exists(entity: IVehicle): boolean { + return mp.vehicles.exists(entity.id); + } } export { @@ -290,5 +298,5 @@ export { RageEntityAttachmentPool, RageVehicle, RageVehiclePool, - + } \ 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 dc4e1514..3afd421f 100644 --- a/ReallifeGamemode.Client/core/rage-mp/game.ts +++ b/ReallifeGamemode.Client/core/rage-mp/game.ts @@ -1,4 +1,4 @@ -import { IGame, IUi, IEvents, IPlayerPool, IVehiclePool, IEntityAttachmentPool } from "../../game"; +import { IGame, IUi, IEvents, IPlayerPool, IVehiclePool, IEntityAttachmentPool } from "../../game"; import RageEvents from "./events"; import RageUi from "./ui"; import { RagePlayerPool, RageVehiclePool, RageEntityAttachmentPool } from "./entities"; @@ -10,8 +10,8 @@ export default class RageGame implements IGame { events: IEvents = new RageEvents; ui: IUi = new RageUi; - async wait(ms: number): Promise { - await mp.game.waitAsync(ms); + wait(ms: number): void { + mp.game.wait(ms); } disableDefaultEngineBehaviour(): void { diff --git a/ReallifeGamemode.Client/core/rage-mp/ui.ts b/ReallifeGamemode.Client/core/rage-mp/ui.ts index 369e620d..bfe6a788 100644 --- a/ReallifeGamemode.Client/core/rage-mp/ui.ts +++ b/ReallifeGamemode.Client/core/rage-mp/ui.ts @@ -1,4 +1,4 @@ -import { IUi, IBrowser } from "../../game"; +import { IUi, IBrowser } from "../../game"; import { Menu } from "../../libs/NativeUI/index"; import { GlobalData } from "../.."; diff --git a/ReallifeGamemode.Client/game.ts b/ReallifeGamemode.Client/game.ts index db02729b..c201e07d 100644 --- a/ReallifeGamemode.Client/game.ts +++ b/ReallifeGamemode.Client/game.ts @@ -1,5 +1,5 @@ interface IGame { - wait(ms: number): Promise; + wait(ms: number): void; events: IEvents; ui: IUi; @@ -75,6 +75,7 @@ interface IVehicle extends IEntity { interface IEntityPool { at(id: number): TEntity; forEach(fn: (entity: TEntity) => void): void; + exists(entity: TEntity): boolean; } diff --git a/ReallifeGamemode.Client/index.ts b/ReallifeGamemode.Client/index.ts index 89257c40..decabaff 100644 --- a/ReallifeGamemode.Client/index.ts +++ b/ReallifeGamemode.Client/index.ts @@ -1,4 +1,4 @@ -/** +/** * @overview Life of German Reallife - Login index.js * @author VegaZ, hydrant * @copyright (c) 2008 - 2018 Life of German @@ -39,7 +39,7 @@ game.events.onPlayerCommand((cmd) => { mp.game.vehicle.defaultEngineBehaviour = false; mp.gui.chat.show(false); -const chatbox = mp.browsers.new("package://assets/chat/index.html"); +const chatbox = mp.browsers.new("package://assets/html/chat/index.html"); chatbox.markAsChat(); require('./Gui/house'); @@ -186,6 +186,9 @@ ped(); import reportList from './Player/reportmenu'; reportList(globalData); +import polygonHandler from './Player/polygons'; +polygonHandler(); + import checkpointHandle from './util/checkpoint'; checkpointHandle(globalData); @@ -265,9 +268,17 @@ antiAfk(globalData); import ammunation from './Interaction/ammunation/ammunation'; ammunation(globalData); +import handsup from './Player/handsup'; +handsup(); + +import spawnschutz from './Player/spawnschutz'; +spawnschutz(); + + require('./Gui/policedepartment'); require('./Gui/helptext'); require('./admin/spectate'); +require('./polygons/index'); interface VehicleData { EngineState: boolean; @@ -276,4 +287,4 @@ interface VehicleData { export { VehicleData -} \ No newline at end of file +} diff --git a/ReallifeGamemode.Client/polygons/events.ts b/ReallifeGamemode.Client/polygons/events.ts new file mode 100644 index 00000000..5df30b37 --- /dev/null +++ b/ReallifeGamemode.Client/polygons/events.ts @@ -0,0 +1,22 @@ +import polygons from "."; + +setInterval(() => { + const { position, dimension } = mp.players.local; + + polygons.pool.map((polygon) => { + + if (polygon.colliding) { + if (!polygons.isPositionWithinPolygon(position, polygon, dimension)) { + polygon.colliding = false; + mp.events.call('playerLeavePolygon', polygon); + } + } + else { + if (polygons.isPositionWithinPolygon(position, polygon, dimension)) { + polygon.colliding = true; + mp.events.call('playerEnterPolygon', polygon); + } + } + }); + +}, 100); \ No newline at end of file diff --git a/ReallifeGamemode.Client/polygons/helpers.ts b/ReallifeGamemode.Client/polygons/helpers.ts new file mode 100644 index 00000000..283ddf4a --- /dev/null +++ b/ReallifeGamemode.Client/polygons/helpers.ts @@ -0,0 +1,55 @@ +import polygons from "."; + +const isPointInArea2D = (point, area): boolean => { + let x = point[0], y = point[1]; + + let inside = false; + + for (let i = 0, j = area.length - 1; i < area.length; j = i++) { + let xi = area[i][0], yi = area[i][1]; + let xj = area[j][0], yj = area[j][1]; + + let intersect = ((yi > y) != (yj > y)) + && (x < (xj - xi) * (y - yi) / (yj - yi) + xi); + + if (intersect) + inside = !inside; + } + + return inside; +}; + +const TWOPI = 6.283185307179586476925287; +const EPSILON = 0.0000001; + +const modulus = (p): number => Math.sqrt((p.x * p.x) + (p.y * p.y) + (p.z *p.z)); + +const getAngleSumBetweenPositionAndVertices = (position, vertices): number => { + let i; + let m1, m2; + let anglesum=0, costheta; + + for (i = 0; i < vertices.length; i++) { + + const p1 = new mp.Vector3(vertices[i].x - position.x, vertices[i].y - position.y, vertices[i].z - position.z); + const p2 = new mp.Vector3(vertices[(i+1)%vertices.length].x - position.x, vertices[(i+1)%vertices.length].y - position.y, vertices[(i+1)%vertices.length].z - position.z); + + m1 = modulus(p1); + m2 = modulus(p2); + + if (m1*m2 <= EPSILON) + return(TWOPI); + else + costheta = (p1.x*p2.x + p1.y*p2.y + p1.z*p2.z) / (m1*m2); + + anglesum += Math.acos(costheta); + } + return (anglesum); +} + +const generateUniquePolygonId = (): number => { + const timestamp = Date.now(); + return polygons.pool.some(p => p.id === timestamp) ? generateUniquePolygonId() : timestamp; +}; + +export { isPointInArea2D, generateUniquePolygonId, getAngleSumBetweenPositionAndVertices }; \ No newline at end of file diff --git a/ReallifeGamemode.Client/polygons/index.ts b/ReallifeGamemode.Client/polygons/index.ts new file mode 100644 index 00000000..5417de65 --- /dev/null +++ b/ReallifeGamemode.Client/polygons/index.ts @@ -0,0 +1,71 @@ +const { generateUniquePolygonId, getAngleSumBetweenPositionAndVertices, isPointInArea2D } = require('./helpers'); + +require('./render'); +require('./events'); + +class PolygonManager { + pool: Polygon[] = new Array(); + + add(vertices: Vector3Mp[], height: number, visible: boolean, lineColorRGBA: [number, number, number, number], dimension: number = 0) { + + const polygon: Polygon = { + id: generateUniquePolygonId(), + vertices, + height, + colliding: false, + lineColorRGBA: lineColorRGBA, + dimension: dimension, + visible: visible + } + + this.pool.push(polygon); + + return polygon; + } + + remove(polygon: Polygon) { + const index = this.pool.findIndex(p => p.id === polygon.id); + + if (index !== -1) + this.pool.splice(index, 1); + } + + exists(polygon: Polygon) { + return this.pool.some(p => p.id === polygon.id) + } + + isPositionWithinPolygon(position: Vector3Mp, polygon: Polygon, dimension: number) { + if (dimension && polygon.dimension !== dimension && polygon.dimension !== -1) + return false; + + const { vertices } = polygon; + + const polygonPoints2D = []; + + for (let i in vertices) { + if (position.z >= vertices[i].z && position.z <= (vertices[i].z + polygon.height) || getAngleSumBetweenPositionAndVertices(position, vertices) >= 5.8) + polygonPoints2D.push([vertices[i].x, vertices[i].y]); + else + return false; + } + + return isPointInArea2D([position.x, position.y], polygonPoints2D); + } +} + +type Polygon = { + id: number; + vertices: Vector3Mp[]; + height: number; + visible: boolean; + colliding: boolean; + dimension: number; + lineColorRGBA: [number, number, number, number]; +}; + +const polygons = new PolygonManager(); + +export default polygons; +export { Polygon }; + + diff --git a/ReallifeGamemode.Client/polygons/render.ts b/ReallifeGamemode.Client/polygons/render.ts new file mode 100644 index 00000000..26edc02f --- /dev/null +++ b/ReallifeGamemode.Client/polygons/render.ts @@ -0,0 +1,29 @@ +import polygons from "."; + +mp.events.add('render', () => { + + polygons.pool.forEach(polygon => { + if (!polygon.visible) return; + + const { vertices, height, lineColorRGBA } = polygon; + + vertices.forEach((vertex, index) => { + + const nextVertex = index === (vertices.length - 1) ? vertices[0] : vertices[index + 1]; + + // Deepness lower line + mp.game.graphics.drawLine(vertex.x, vertex.y, vertex.z, nextVertex.x, nextVertex.y, nextVertex.z, ...lineColorRGBA); + + // Current vertex height line + mp.game.graphics.drawLine(vertex.x, vertex.y, vertex.z, vertex.x, vertex.y, vertex.z + height, ...lineColorRGBA); + + // Next vertex height line + mp.game.graphics.drawLine(nextVertex.x, nextVertex.y, nextVertex.z, nextVertex.x, nextVertex.y, nextVertex.z + height, ...lineColorRGBA); + + // Deepness higher line + mp.game.graphics.drawLine(vertex.x, vertex.y, vertex.z + height, nextVertex.x, nextVertex.y, nextVertex.z + height, ...lineColorRGBA); + }); + + }); + +}); \ No newline at end of file diff --git a/ReallifeGamemode.Client/util/attachmentMngr.ts b/ReallifeGamemode.Client/util/attachmentMngr.ts index bb62ee5d..d46da114 100644 --- a/ReallifeGamemode.Client/util/attachmentMngr.ts +++ b/ReallifeGamemode.Client/util/attachmentMngr.ts @@ -15,7 +15,7 @@ export default function attachmentManager(game: IGame) { { attachments: {}, - addFor: async function (entity, id) { + addFor: function (entity, id) { if (this.attachments.hasOwnProperty(id)) { if (!entity.__attachmentObjects) { entity.__attachmentObjects = {}; diff --git a/ReallifeGamemode.Client/util/planeschool.ts b/ReallifeGamemode.Client/util/planeschool.ts index 992b871e..d4dcd187 100644 --- a/ReallifeGamemode.Client/util/planeschool.ts +++ b/ReallifeGamemode.Client/util/planeschool.ts @@ -1,4 +1,4 @@ -import * as NativeUI from '../libs/NativeUI'; +import * as NativeUI from '../libs/NativeUI'; const Menu = NativeUI.Menu; const UIMenuItem = NativeUI.UIMenuItem; const UIMenuListItem = NativeUI.UIMenuListItem; @@ -25,9 +25,7 @@ export default function planeSchoolHandle(globalData: IGlobalData) { var waitFinished = false; mp.events.add('planeSchoolMenu', () => { - mp.game.ui.setTextComponentFormat('STRING'); - mp.game.ui.addTextComponentSubstringPlayerName('Drücke ~INPUT_CONTEXT~, um das Flugschulmenü zu öffnen'); - mp.game.ui.displayHelpTextFromStringLabel(0, true, true, -1); + mp.events.call("renderHelpTextOnScreen", "~s~Drücke ~g~E~s~, um die ~b~Flugprüfung ~s~zu beginnen"); mp.keys.bind(0x45, false, keyPressHandler); keyBound = true; }); @@ -67,4 +65,4 @@ export default function planeSchoolHandle(globalData: IGlobalData) { mp.events.call('removeplaneSchoolMenu', false); mp.events.callRemote('startplaneSchool'); } -} \ No newline at end of file +} diff --git a/ReallifeGamemode.Client/util/weapondamage.ts b/ReallifeGamemode.Client/util/weapondamage.ts index 1907a03a..c631b268 100644 --- a/ReallifeGamemode.Client/util/weapondamage.ts +++ b/ReallifeGamemode.Client/util/weapondamage.ts @@ -1,4 +1,24 @@ -export default function weapondamageUtil() { +import { isInAnyNoDMPolygon, listNoDMZones } from "../Player/polygons"; +import polygons from "../polygons"; +import { getWantedCount } from "../Gui/wanteds"; +import { spawnschutzEnabled } from "../Player/spawnschutz"; + + +function isTargetInPolygon(pos): boolean { + let found = false; + + listNoDMZones.forEach(zone => { + if (polygons.isPositionWithinPolygon(pos, zone, zone.dimension)) { + found = true; + return; + } + }); + if (found) return true; + + return false; +} + +export default function weapondamageUtil() { let blockInput = false; mp.players.local.setSuffersCriticalHits(false); @@ -7,6 +27,22 @@ player.setSuffersCriticalHits(false); }); + mp.events.add(RageEnums.EventKey.INCOMING_DAMAGE, (sourceEntity: EntityMp, sourcePlayer: PlayerMp, targetEntity: EntityMp, weapon: number, boneIndex: number, damage: number) => { + if ((isTargetInPolygon(sourceEntity.position) || isInAnyNoDMPolygon) && getWantedCount() === 0) { + return true; + } + + if (spawnschutzEnabled && getWantedCount() === 0) { + return true; + } + }); + + mp.events.add(RageEnums.EventKey.OUTGOING_DAMAGE, (sourceEntity, targetEntity, sourcePlayer, weapon, boneIndex, damage) => { + if (spawnschutzEnabled && getWantedCount() === 0) { + return true; + } + }); + mp.events.add("render", () => { if (blockInput) { mp.game.controls.disableControlAction(32, 142, true); diff --git a/ReallifeGamemode.Client/vehiclesync/smoothtrottle.ts b/ReallifeGamemode.Client/vehiclesync/smoothtrottle.ts index 884c1faa..9d5dc874 100644 --- a/ReallifeGamemode.Client/vehiclesync/smoothtrottle.ts +++ b/ReallifeGamemode.Client/vehiclesync/smoothtrottle.ts @@ -1,4 +1,4 @@ -//This script will make vehicles have smoother acceleration. +//This script will make vehicles have smoother acceleration. //To disable the script call an event and set "GlobalDisable" to true. //To disable individual sections, set "DisableAntiReverse" or "DisableSmoothThrottle" to true. diff --git a/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts b/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts index f7989e42..461ea0fd 100644 --- a/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts +++ b/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts @@ -1,4 +1,4 @@ -import game from '../index'; +import game from '../index'; import { IVehicle, EntityType, IEntity, VehicleSeat, DoorState } from '../game'; import { parseJson } from '../util'; import { VehicleData } from '../game'; @@ -10,9 +10,9 @@ game.events.add('SERVER:Vehicle:UpdateData', (vehId, dataStr) => { setVehicleData(vehicle, data); }); -game.events.onPlayerEnterVehicle(async (vehicle, seat) => { +game.events.onPlayerEnterVehicle((vehicle, seat) => { while (!game.players.local.inVehicle) { - await game.wait(0); + game.wait(0); } if (vehicle) { @@ -22,11 +22,11 @@ game.events.onPlayerEnterVehicle(async (vehicle, seat) => { } }); -game.events.onPlayerExitVehicle(async () => { +game.events.onPlayerExitVehicle(() => { var veh = game.players.local.vehicle; while (game.players.local.inVehicle) { - await game.wait(0); + game.wait(0); } if (veh) { @@ -51,7 +51,7 @@ game.events.onEntityStreamIn((entity: IEntity) => { }); function setVehicleData(veh: IVehicle, data: VehicleData): void { - if (!veh) { + if (!veh || !game.vehicles.exists(veh)) { return; } diff --git a/ReallifeGamemode.Database/Add-Migration.ps1 b/ReallifeGamemode.Database/Add-Migration.ps1 new file mode 100644 index 00000000..43d4d65d --- /dev/null +++ b/ReallifeGamemode.Database/Add-Migration.ps1 @@ -0,0 +1,10 @@ +Param +( + [Parameter(Mandatory=$true)] + [string]$MigrationName +) + +$root = $PSScriptRoot + +dotnet tool update dotnet-ef --global +dotnet ef migrations add $MigrationName --project "$root\ReallifeGamemode.Database.csproj" --startup-project "$root\..\ReallifeGamemode.Server\ReallifeGamemode.Server.csproj" --configuration "Database" \ No newline at end of file diff --git a/ReallifeGamemode.Database/Entities/UserVehicle.cs b/ReallifeGamemode.Database/Entities/UserVehicle.cs index 41000950..f7b54e6d 100644 --- a/ReallifeGamemode.Database/Entities/UserVehicle.cs +++ b/ReallifeGamemode.Database/Entities/UserVehicle.cs @@ -15,10 +15,13 @@ namespace ReallifeGamemode.Database.Entities { [ForeignKey("User")] public int UserId { get; set; } + public User User { get; set; } public int? Price { get; set; } + public int? BusinessId { get; set; } + public override string ToString() { return "Spieler Fahrzeug | Besitzer: " + GetOwner().Name; diff --git a/ReallifeGamemode.Database/Migrations/20210421190610_UserVehicleBusinessId.Designer.cs b/ReallifeGamemode.Database/Migrations/20210421190610_UserVehicleBusinessId.Designer.cs new file mode 100644 index 00000000..bcbecc29 --- /dev/null +++ b/ReallifeGamemode.Database/Migrations/20210421190610_UserVehicleBusinessId.Designer.cs @@ -0,0 +1,2177 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using ReallifeGamemode.Database.Models; + +namespace ReallifeGamemode.Database.Migrations +{ + [DbContext(typeof(DatabaseContext))] + [Migration("20210421190610_UserVehicleBusinessId")] + partial class UserVehicleBusinessId + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "3.1.3") + .HasAnnotation("PropertyAccessMode", PropertyAccessMode.PreferFieldDuringConstruction) + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ATM", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("Faulty") + .HasColumnType("tinyint(1)"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("ATMs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Ban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Applied") + .HasColumnType("int"); + + b.Property("BannedBy") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Reason") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("UntilDateTime") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Bans"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoute", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("BusRoutes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoutePoint", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BusRouteId") + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("BusRouteId"); + + b.ToTable("BusRoutesPoints"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusinessBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("BusinessId") + .IsUnique(); + + b.ToTable("BusinessBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusinessData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("BusinessData"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Character", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ageing") + .HasColumnType("tinyint unsigned"); + + b.Property("AgeingOpacity") + .HasColumnType("float"); + + b.Property("BeardColor") + .HasColumnType("tinyint unsigned"); + + b.Property("Blemishes") + .HasColumnType("tinyint unsigned"); + + b.Property("BlemishesOpacity") + .HasColumnType("float"); + + b.Property("Blush") + .HasColumnType("tinyint unsigned"); + + b.Property("BlushColor") + .HasColumnType("tinyint unsigned"); + + b.Property("BlushOpacity") + .HasColumnType("float"); + + b.Property("BrowDepth") + .HasColumnType("float"); + + b.Property("BrowHeight") + .HasColumnType("float"); + + b.Property("CheekDepth") + .HasColumnType("float"); + + b.Property("CheekboneHeight") + .HasColumnType("float"); + + b.Property("CheekboneWidth") + .HasColumnType("float"); + + b.Property("ChestHair") + .HasColumnType("tinyint unsigned"); + + b.Property("ChestHairColor") + .HasColumnType("tinyint unsigned"); + + b.Property("ChestHairOpacity") + .HasColumnType("float"); + + b.Property("ChinDepth") + .HasColumnType("float"); + + b.Property("ChinHeight") + .HasColumnType("float"); + + b.Property("ChinIndent") + .HasColumnType("float"); + + b.Property("ChinWidth") + .HasColumnType("float"); + + b.Property("Complexion") + .HasColumnType("tinyint unsigned"); + + b.Property("ComplexionOpacity") + .HasColumnType("float"); + + b.Property("EyeColor") + .HasColumnType("tinyint unsigned"); + + b.Property("EyeSize") + .HasColumnType("float"); + + b.Property("EyebrowColor") + .HasColumnType("tinyint unsigned"); + + b.Property("Eyebrows") + .HasColumnType("tinyint unsigned"); + + b.Property("EyebrowsOpacity") + .HasColumnType("float"); + + b.Property("FacialHair") + .HasColumnType("tinyint unsigned"); + + b.Property("FacialHairOpacity") + .HasColumnType("float"); + + b.Property("Father") + .HasColumnType("tinyint unsigned"); + + b.Property("Freckles") + .HasColumnType("tinyint unsigned"); + + b.Property("FrecklesOpacity") + .HasColumnType("float"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("Hair") + .HasColumnType("tinyint unsigned"); + + b.Property("HairColor") + .HasColumnType("tinyint unsigned"); + + b.Property("HairHighlightColor") + .HasColumnType("tinyint unsigned"); + + b.Property("JawShape") + .HasColumnType("float"); + + b.Property("JawWidth") + .HasColumnType("float"); + + b.Property("LipThickness") + .HasColumnType("float"); + + b.Property("Lipstick") + .HasColumnType("tinyint unsigned"); + + b.Property("LipstickColor") + .HasColumnType("tinyint unsigned"); + + b.Property("LipstickOpacity") + .HasColumnType("float"); + + b.Property("Makeup") + .HasColumnType("tinyint unsigned"); + + b.Property("MakeupOpacity") + .HasColumnType("float"); + + b.Property("Mother") + .HasColumnType("tinyint unsigned"); + + b.Property("NeckWidth") + .HasColumnType("float"); + + b.Property("NoseBottomHeight") + .HasColumnType("float"); + + b.Property("NoseBridgeDepth") + .HasColumnType("float"); + + b.Property("NoseBroken") + .HasColumnType("float"); + + b.Property("NoseTipHeight") + .HasColumnType("float"); + + b.Property("NoseTipLength") + .HasColumnType("float"); + + b.Property("NoseWidth") + .HasColumnType("float"); + + b.Property("Similarity") + .HasColumnType("float"); + + b.Property("SkinSimilarity") + .HasColumnType("float"); + + b.Property("SunDamage") + .HasColumnType("tinyint unsigned"); + + b.Property("SunDamageOpacity") + .HasColumnType("float"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Characters"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.CharacterCloth", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClothId") + .HasColumnType("int"); + + b.Property("Duty") + .HasColumnType("tinyint(1)"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("SlotType") + .HasColumnType("tinyint unsigned"); + + b.Property("Texture") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("CharacterClothes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ClothCombination", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("Top") + .HasColumnType("int"); + + b.Property("Torso") + .HasColumnType("int"); + + b.Property("Undershirt") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("ClothCombinations"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Door", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Category") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Locked") + .HasColumnType("tinyint(1)"); + + b.Property("Model") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Radius") + .HasColumnType("float"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("Doors"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.DutyCloth", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClothId") + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("SlotType") + .HasColumnType("tinyint unsigned"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("DutyClothes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Faction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("GangOwned") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("StateOwned") + .HasColumnType("tinyint(1)"); + + b.Property("WeaponDealTime") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("BankAccountId"); + + b.ToTable("Factions"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("Bic") + .HasColumnType("varchar(12) CHARACTER SET utf8mb4") + .HasMaxLength(12); + + b.Property("Iban") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.HasKey("Id"); + + b.ToTable("FactionBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionRank", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("RankName") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("FactionRanks"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionWeapon", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ammount") + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Rank") + .HasColumnType("int"); + + b.Property("SlotID") + .HasColumnType("int"); + + b.Property("WeaponModel") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("FactionWeapons"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GotoPoint", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Description") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("GotoPoints"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Group", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("BankAccountId"); + + b.ToTable("Groups"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Balance") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("GroupBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.House", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("CanRentIn") + .HasColumnType("tinyint(1)"); + + b.Property("LastRentSetTime") + .HasColumnType("datetime(6)"); + + b.Property("OwnerId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("RentalFee") + .HasColumnType("int"); + + b.Property("Type") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("BankAccountId"); + + b.HasIndex("OwnerId"); + + b.ToTable("Houses"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Balance") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("HouseBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseRental", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("HouseId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("HouseId"); + + b.HasIndex("UserId"); + + b.ToTable("HouseRentals"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Interior", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("EnterPositionStr") + .HasColumnName("EnterPosition") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("ExitPositionStr") + .HasColumnName("ExitPosition") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("Interiors"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Location", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Heading") + .HasColumnType("double"); + + b.Property("X") + .HasColumnType("double"); + + b.Property("Y") + .HasColumnType("double"); + + b.Property("Z") + .HasColumnType("double"); + + b.HasKey("Id"); + + b.ToTable("Locations"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.BankAccountTransactionHistory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Fee") + .HasColumnType("int"); + + b.Property("MoneySent") + .HasColumnType("int"); + + b.Property("NewReceiverBalance") + .HasColumnType("int"); + + b.Property("NewSenderBalance") + .HasColumnType("int"); + + b.Property("Origin") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Receiver") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("ReceiverBalance") + .HasColumnType("int"); + + b.Property("Sender") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("SenderBalance") + .HasColumnType("int"); + + b.Property("Timestamp") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.ToTable("BankAccountTransactionLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("Discriminator") + .IsRequired() + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Text") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Time") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("ChatLogs"); + + b.HasDiscriminator("Discriminator").HasValue("ChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.CommandLogEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("Command") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Time") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("CommandLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Death", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("CauseOfDeath") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("KillerHeading") + .HasColumnType("float"); + + b.Property("KillerId") + .HasColumnType("int"); + + b.Property("KillerPositionX") + .HasColumnType("float"); + + b.Property("KillerPositionY") + .HasColumnType("float"); + + b.Property("KillerPositionZ") + .HasColumnType("float"); + + b.Property("Timestamp") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.Property("VictimHeading") + .HasColumnType("float"); + + b.Property("VictimId") + .HasColumnType("int"); + + b.Property("VictimPositionX") + .HasColumnType("float"); + + b.Property("VictimPositionY") + .HasColumnType("float"); + + b.Property("VictimPositionZ") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("KillerId"); + + b.HasIndex("VictimId"); + + b.ToTable("DeathLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.LoginLogoutLogEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("IpAddress") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("LoginLogout") + .HasColumnType("tinyint(1)"); + + b.Property("PlayerId") + .HasColumnType("bigint"); + + b.Property("SocialClubName") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Time") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("Username") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("LoginLogoutLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.News", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Caption") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Content") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Timestamp") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("News"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedBlip", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Alpha") + .HasColumnType("tinyint unsigned"); + + b.Property("Color") + .HasColumnType("tinyint unsigned"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("DrawDistance") + .HasColumnType("float"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Rotation") + .HasColumnType("float"); + + b.Property("Scale") + .HasColumnType("float"); + + b.Property("ShortRange") + .HasColumnType("tinyint(1)"); + + b.Property("Sprite") + .HasColumnType("smallint"); + + b.HasKey("Id"); + + b.ToTable("Blips"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedMarker", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("ColorA") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorB") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorG") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorR") + .HasColumnType("tinyint unsigned"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("DirectionX") + .HasColumnType("float"); + + b.Property("DirectionY") + .HasColumnType("float"); + + b.Property("DirectionZ") + .HasColumnType("float"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RotationX") + .HasColumnType("float"); + + b.Property("RotationY") + .HasColumnType("float"); + + b.Property("RotationZ") + .HasColumnType("float"); + + b.Property("Scale") + .HasColumnType("float"); + + b.Property("Type") + .HasColumnType("tinyint unsigned"); + + b.Property("Visible") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.ToTable("Markers"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedPed", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("HashModel") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Heading") + .HasColumnType("float"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Type") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Peds"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedPickup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("PositionX") + .HasColumnType("float") + .HasMaxLength(128); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RespawnTime") + .HasColumnType("int"); + + b.Property("RotationX") + .HasColumnType("float"); + + b.Property("RotationY") + .HasColumnType("float"); + + b.Property("RotationZ") + .HasColumnType("float"); + + b.Property("Vehicle") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.ToTable("Pickups"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedTextLabel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("ColorA") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorB") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorG") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorR") + .HasColumnType("tinyint unsigned"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("DrawDistance") + .HasColumnType("float"); + + b.Property("Font") + .HasColumnType("tinyint unsigned"); + + b.Property("LOS") + .HasColumnType("tinyint(1)"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Text") + .IsRequired() + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("TextLabels"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ServerVariable", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.Property("Variable") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("ServerVariables"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ServerVehicle", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(true); + + b.Property("Discriminator") + .IsRequired() + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("DistanceDriven") + .HasColumnType("float"); + + b.Property("Heading") + .HasColumnType("float"); + + b.Property("Livery") + .HasColumnType("int"); + + b.Property("Locked") + .HasColumnType("tinyint(1)"); + + b.Property("Model") + .HasColumnType("int unsigned"); + + b.Property("NumberPlate") + .HasColumnType("varchar(8) CHARACTER SET utf8mb4") + .HasMaxLength(8); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("PrimaryColor") + .HasColumnType("int"); + + b.Property("SecondaryColor") + .HasColumnType("int"); + + b.Property("TankAmount") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("ServerVehicles"); + + b.HasDiscriminator("Discriminator").HasValue("ServerVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopClothe", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Category") + .HasColumnType("int"); + + b.Property("ClotheId") + .HasColumnType("int"); + + b.Property("ComponentId") + .HasColumnType("int"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("TypeId") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("ShopClothes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("ShopId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("ShopItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.TuningGarage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("TuningGarages"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Turfs", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Color") + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("MaxValue") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Owner") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Range") + .HasColumnType("float"); + + b.Property("Rotation") + .HasColumnType("float"); + + b.Property("Surplus") + .HasColumnType("tinyint(1)"); + + b.Property("Value") + .HasColumnType("int"); + + b.Property("Vector") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Turfs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("AdminLevel") + .HasColumnType("int"); + + b.Property("BanId") + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("BusSkill") + .HasColumnType("int"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("Dead") + .HasColumnType("tinyint(1)"); + + b.Property("DriverLicenseBike") + .HasColumnType("tinyint(1)"); + + b.Property("DriverLicenseVehicle") + .HasColumnType("tinyint(1)"); + + b.Property("Email") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("FactionLeader") + .HasColumnType("tinyint(1)"); + + b.Property("FactionRankId") + .HasColumnType("int"); + + b.Property("FlyingLicensePlane") + .HasColumnType("tinyint(1)"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.Property("GroupRank") + .HasColumnType("int"); + + b.Property("Handmoney") + .HasColumnType("int"); + + b.Property("HouseId") + .HasColumnType("int"); + + b.Property("JailTime") + .HasColumnType("int"); + + b.Property("JobId") + .HasColumnType("int"); + + b.Property("LogUserId") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Password") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("PaydayTimer") + .HasColumnType("int"); + + b.Property("PilotSkill") + .HasColumnType("int"); + + b.Property("PlayedMinutes") + .HasColumnType("int"); + + b.Property("Points") + .HasColumnType("int"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RegistrationDate") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.Property("SocialClubName") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Wage") + .HasColumnType("int"); + + b.Property("Wanteds") + .HasColumnType("int"); + + b.Property("WeaponLicense") + .HasColumnType("tinyint(1)"); + + b.Property("failpoints") + .HasColumnType("int"); + + b.Property("otheramount") + .HasColumnType("int"); + + b.Property("trashcount") + .HasColumnType("int"); + + b.Property("warn") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("BanId"); + + b.HasIndex("BankAccountId"); + + b.HasIndex("BusinessId") + .IsUnique(); + + b.HasIndex("CharacterId"); + + b.HasIndex("FactionId"); + + b.HasIndex("FactionRankId"); + + b.HasIndex("GroupId"); + + b.HasIndex("HouseId"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("Bic") + .HasColumnType("varchar(12) CHARACTER SET utf8mb4") + .HasMaxLength(12); + + b.Property("Iban") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.HasKey("Id"); + + b.ToTable("UserBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserWeapon", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ammo") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("WeaponId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.HasIndex("WeaponId"); + + b.ToTable("UserWeapons"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("VehicleId"); + + b.ToTable("VehicleItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleMod", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ModId") + .HasColumnType("int"); + + b.Property("ServerVehicleId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ServerVehicleId", "Slot") + .IsUnique(); + + b.ToTable("VehicleMods"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Weapon", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ammo") + .HasColumnType("int"); + + b.Property("AmmunationActive") + .HasColumnType("tinyint(1)"); + + b.Property("CategoryId") + .HasColumnType("int"); + + b.Property("Legal") + .HasColumnType("tinyint(1)"); + + b.Property("Price") + .HasColumnType("float"); + + b.Property("SlotID") + .HasColumnType("int"); + + b.Property("WeaponModel") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.ToTable("Weapons"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.WeaponCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Category") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("WeaponCategories"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Whitelist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("SocialClubName") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("WhitelistEntries"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.DepartmentChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("DepartmentChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.FactionChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.HasIndex("FactionId"); + + b.HasDiscriminator().HasValue("FactionChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.GangChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("GangChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.GroupChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.HasIndex("GroupId"); + + b.HasDiscriminator().HasValue("GroupChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.LeaderChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("LeaderChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.LocalChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("LocalChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.NewsChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("NewsChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.OChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("OChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("BuyPrice") + .HasColumnType("int"); + + b.Property("Owners") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.ToTable("FactionVehicles"); + + b.HasDiscriminator().HasValue("FactionVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.HasIndex("GroupId"); + + b.HasDiscriminator().HasValue("GroupVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.JobVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("JobId") + .HasColumnType("int"); + + b.HasDiscriminator().HasValue("JobVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.NoobSpawnVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("NoobSpawnVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.NoobVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("NoobVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("SavedVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.SchoolVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("SchoolId") + .HasColumnType("int"); + + b.HasDiscriminator().HasValue("SchoolVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.ToTable("ShopVehicles"); + + b.HasDiscriminator().HasValue("ShopVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("BusinessId") + .HasColumnName("UserVehicle_BusinessId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnName("UserVehicle_Price") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasIndex("UserId"); + + b.ToTable("UserVehicles"); + + b.HasDiscriminator().HasValue("UserVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Ban", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoutePoint", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.BusRoute", "BusRoute") + .WithMany("RoutePoints") + .HasForeignKey("BusRouteId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Character", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.CharacterCloth", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Door", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.DutyCloth", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Faction", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.FactionBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionRank", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionWeapon", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Group", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.GroupBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.House", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.HouseBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseRental", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.House", "House") + .WithMany("Rentals") + .HasForeignKey("HouseId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.CommandLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Death", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "Killer") + .WithMany() + .HasForeignKey("KillerId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "Victim") + .WithMany() + .HasForeignKey("VictimId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.LoginLogoutLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.News", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.User", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Ban", "Ban") + .WithMany() + .HasForeignKey("BanId"); + + b.HasOne("ReallifeGamemode.Database.Entities.UserBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Character", "Character") + .WithMany() + .HasForeignKey("CharacterId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + + b.HasOne("ReallifeGamemode.Database.Entities.FactionRank", "FactionRank") + .WithMany() + .HasForeignKey("FactionRankId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") + .WithMany() + .HasForeignKey("GroupId"); + + b.HasOne("ReallifeGamemode.Database.Entities.House", "House") + .WithMany() + .HasForeignKey("HouseId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserItem", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserWeapon", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ReallifeGamemode.Database.Entities.Weapon", "Weapon") + .WithMany() + .HasForeignKey("WeaponId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleItem", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.ServerVehicle", "Vehicle") + .WithMany() + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleMod", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.ServerVehicle", "Vehicle") + .WithMany() + .HasForeignKey("ServerVehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Weapon", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.WeaponCategory", "WeaponCategory") + .WithMany() + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.FactionChatLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.GroupChatLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") + .WithMany() + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupVehicle", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") + .WithMany() + .HasForeignKey("GroupId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserVehicle", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ReallifeGamemode.Database/Migrations/20210421190610_UserVehicleBusinessId.cs b/ReallifeGamemode.Database/Migrations/20210421190610_UserVehicleBusinessId.cs new file mode 100644 index 00000000..41be838a --- /dev/null +++ b/ReallifeGamemode.Database/Migrations/20210421190610_UserVehicleBusinessId.cs @@ -0,0 +1,109 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace ReallifeGamemode.Database.Migrations +{ + public partial class UserVehicleBusinessId : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_ChatLogs_Users_UserId", + table: "ChatLogs"); + + migrationBuilder.DropForeignKey( + name: "FK_ChatLogs_Factions_FactionId", + table: "ChatLogs"); + + migrationBuilder.DropForeignKey( + name: "FK_ChatLogs_Groups_GroupId", + table: "ChatLogs"); + + migrationBuilder.AddColumn( + name: "UserVehicle_BusinessId", + table: "ServerVehicles", + nullable: true); + + migrationBuilder.AlterColumn( + name: "UserId", + table: "ChatLogs", + nullable: false, + oldClrType: typeof(int), + oldType: "int", + oldNullable: true); + + migrationBuilder.AddForeignKey( + name: "FK_ChatLogs_Users_UserId", + table: "ChatLogs", + column: "UserId", + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_ChatLogs_Factions_FactionId", + table: "ChatLogs", + column: "FactionId", + principalTable: "Factions", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_ChatLogs_Groups_GroupId", + table: "ChatLogs", + column: "GroupId", + principalTable: "Groups", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_ChatLogs_Users_UserId", + table: "ChatLogs"); + + migrationBuilder.DropForeignKey( + name: "FK_ChatLogs_Factions_FactionId", + table: "ChatLogs"); + + migrationBuilder.DropForeignKey( + name: "FK_ChatLogs_Groups_GroupId", + table: "ChatLogs"); + + migrationBuilder.DropColumn( + name: "UserVehicle_BusinessId", + table: "ServerVehicles"); + + migrationBuilder.AlterColumn( + name: "UserId", + table: "ChatLogs", + type: "int", + nullable: true, + oldClrType: typeof(int)); + + migrationBuilder.AddForeignKey( + name: "FK_ChatLogs_Users_UserId", + table: "ChatLogs", + column: "UserId", + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_ChatLogs_Factions_FactionId", + table: "ChatLogs", + column: "FactionId", + principalTable: "Factions", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_ChatLogs_Groups_GroupId", + table: "ChatLogs", + column: "GroupId", + principalTable: "Groups", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + } + } +} diff --git a/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs b/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs index a13f30e6..fcb3068f 100644 --- a/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs +++ b/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs @@ -814,7 +814,7 @@ namespace ReallifeGamemode.Database.Migrations .ValueGeneratedOnAdd() .HasColumnType("datetime(6)"); - b.Property("UserId") + b.Property("UserId") .HasColumnType("int"); b.HasKey("Id"); @@ -1749,7 +1749,7 @@ namespace ReallifeGamemode.Database.Migrations { b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); - b.Property("FactionId") + b.Property("FactionId") .HasColumnType("int"); b.HasIndex("FactionId"); @@ -1768,7 +1768,7 @@ namespace ReallifeGamemode.Database.Migrations { b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); - b.Property("GroupId") + b.Property("GroupId") .HasColumnType("int"); b.HasIndex("GroupId"); @@ -1891,6 +1891,10 @@ namespace ReallifeGamemode.Database.Migrations { b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + b.Property("BusinessId") + .HasColumnName("UserVehicle_BusinessId") + .HasColumnType("int"); + b.Property("Price") .HasColumnName("UserVehicle_Price") .HasColumnType("int"); @@ -2011,7 +2015,9 @@ namespace ReallifeGamemode.Database.Migrations { b.HasOne("ReallifeGamemode.Database.Entities.User", "User") .WithMany() - .HasForeignKey("UserId"); + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); }); modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.CommandLogEntry", b => @@ -2134,14 +2140,18 @@ namespace ReallifeGamemode.Database.Migrations { b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") .WithMany() - .HasForeignKey("FactionId"); + .HasForeignKey("FactionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); }); modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.GroupChatLogEntry", b => { b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") .WithMany() - .HasForeignKey("GroupId"); + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); }); modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupVehicle", b => diff --git a/ReallifeGamemode.Database/Update-Database.ps1 b/ReallifeGamemode.Database/Update-Database.ps1 new file mode 100644 index 00000000..0f57198a --- /dev/null +++ b/ReallifeGamemode.Database/Update-Database.ps1 @@ -0,0 +1,4 @@ +$root = $PSScriptRoot + +dotnet tool update dotnet-ef --global +dotnet ef database update --project "$root\ReallifeGamemode.Database.csproj" --startup-project "$root\..\ReallifeGamemode.Server\ReallifeGamemode.Server.csproj" --configuration "Database" \ No newline at end of file diff --git a/ReallifeGamemode.Server/Bank/bank.cs b/ReallifeGamemode.Server/Bank/bank.cs index 1781103e..145b97ce 100644 --- a/ReallifeGamemode.Server/Bank/bank.cs +++ b/ReallifeGamemode.Server/Bank/bank.cs @@ -150,8 +150,9 @@ namespace ReallifeGamemode.Server.Bank else { player.SendNotification($"~w~Du hast {target.Name} $~g~{amount} ~w~Überwiesen."); + target.SendNotification($"~w~{player.Name} hat dir $~g~{amount} ~w~Überwiesen."); player.GetUser(dbContext).BankAccount.Balance -= (int)(amount * 1.05); - target.GetUser(dbContext).otheramount = amount; + target.GetUser(dbContext).otheramount += amount; dbContext.SaveChanges(); } } @@ -203,7 +204,7 @@ namespace ReallifeGamemode.Server.Bank { player.SendNotification($"~w~Du hast {target.Name} $~g~{amount} ~w~Überwiesen."); player.GetUser(dbContext).Faction.BankAccount.Balance -= (int)(amount * 1.05); - target.GetUser(dbContext).otheramount = amount; + target.GetUser(dbContext).otheramount += amount; dbContext.SaveChanges(); } } diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 4a29423d..d312239c 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -165,12 +165,6 @@ namespace ReallifeGamemode.Server.Commands [Command("position", "~m~Benutzung: ~s~/position")] public void CmdAdminPosition(Player player) { - if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) - { - ChatService.NotAuthorized(player); - return; - } - ChatService.SendMessage(player, "Position: X Y Z: " + player.Position + " Richtung: " + player.Heading); } @@ -178,8 +172,8 @@ namespace ReallifeGamemode.Server.Commands #region Support - [Command("tog", "~m~Benutzung: ~s~/tog [Typ = ~g~IP~s~, ~g~deathlogs~s~, ~g~LC~s~, ~g~Connect~s~]", GreedyArg = true)] - public void CmdTog(Player player, string typ, string option1 = null, string option2 = null) + [Command("tog", "~m~Benutzung: ~s~/tog [Typ = ~g~IP~s~, ~g~deathlogs~s~, ~g~LC~s~, ~g~Connect~s~, ~g~D~s~, ~g~GA~s~, ~g~All~s~]", GreedyArg = true)] + public void CmdAdminTog(Player player, string typ, string option1 = null, string option2 = null) { if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) { @@ -264,6 +258,34 @@ namespace ReallifeGamemode.Server.Commands player.SendNotification("~g~[Info]~w~ GA-Chat wird nun angezeigt."); } break; + case "all": + if(!player.HasData("togall")) + { + player.SetData("togip", true); + player.SetData("togdeath", true); + player.SetData("togdeathlogs", true); + player.SetData("toglc", true); + player.SetData("togconnect", true); + player.SetData("togd", true); + player.SetData("togga", true); + player.SetData("togall", true); + + player.SendNotification("~g~[Info]~s~ Alle Logs wurden eingeschaltet"); + } + else + { + player.ResetData("togip"); + player.ResetData("togdeath"); + player.ResetData("togdeathlogs"); + player.ResetData("toglc"); + player.ResetData("togconnect"); + player.ResetData("togd"); + player.ResetData("togga"); + player.ResetData("togall"); + + player.SendNotification("~g~[Info]~s~ Alle Logs wurden ausgeschaltet"); + } + break; } } @@ -592,7 +614,7 @@ namespace ReallifeGamemode.Server.Commands [Command("mark", "~m~Benutzung: ~s~/mark")] public void CmdAdminMark(Player player) { - if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) { ChatService.NotAuthorized(player); return; @@ -604,7 +626,7 @@ namespace ReallifeGamemode.Server.Commands [Command("gotomark", "~m~Benutzung: ~s~/gotomark")] public void CmdAdminGotoMark(Player player) { - if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) { ChatService.NotAuthorized(player); return; @@ -1300,13 +1322,11 @@ namespace ReallifeGamemode.Server.Commands if (serverVehicle == null) { VehicleManager.DeleteVehicle(v); - v.Trailer?.Delete(); + VehicleManager.DeleteVehicle(v.Trailer); continue; } Vehicle newVeh = serverVehicle.Spawn(v); - newVeh.Repair(); - newVeh.Rotation = new Vector3(0, 0, serverVehicle.Heading); respawnedVehicleCount++; } @@ -1332,7 +1352,7 @@ namespace ReallifeGamemode.Server.Commands if (target.GetData("isDead") == true) { - ChatService.ErrorMessage(player, "Dieser Spieler ist tot. Nutze /arevive."); + ChatService.ErrorMessage(player, "Dieser Spieler ist tot. Nutze /arevive"); return; } diff --git a/ReallifeGamemode.Server/Commands/FactionCommands.cs b/ReallifeGamemode.Server/Commands/FactionCommands.cs index d9dd2668..83968304 100644 --- a/ReallifeGamemode.Server/Commands/FactionCommands.cs +++ b/ReallifeGamemode.Server/Commands/FactionCommands.cs @@ -154,7 +154,7 @@ namespace ReallifeGamemode.Server.Commands User user = player.GetUser(dbContext); Faction f = user?.Faction; - if ((f == null || !f.StateOwned) && (!user.IsAdmin(AdminLevel.ADMIN) || !player.HasData("todg"))) + if ((f == null || !f.StateOwned) && (!user.IsAdmin(AdminLevel.ADMIN) || !player.HasData("togd"))) { ChatService.NotAuthorized(player); return; @@ -280,7 +280,7 @@ namespace ReallifeGamemode.Server.Commands using var dbContext = new DatabaseContext(); User user = player.GetUser(dbContext); - if ((user?.FactionId == null || user.FactionLeader == false) && !user.IsAdmin(AdminLevel.ADMIN)) + if ((user?.FactionId == null || user.FactionLeader == false) && (!user.IsAdmin(AdminLevel.ADMIN) || !player.HasData("toglc"))) { ChatService.NotAuthorized(player); return; @@ -402,10 +402,17 @@ namespace ReallifeGamemode.Server.Commands ChatService.ErrorMessage(player, "Der Spieler hat eine Revivesperre"); return; } + using (var dbContext = new DatabaseContext()) { var deadPlayerUser = deadPlayer.GetUser(dbContext); + if (deadPlayerUser.Wanteds > 0) + { + ChatService.ErrorMessage(player, "Dieser Spieler hat Wanteds"); + return; + } + if (deadPlayerUser.Handmoney >= 100) { deadPlayerUser.Handmoney -= 100; @@ -426,6 +433,8 @@ namespace ReallifeGamemode.Server.Commands deadPlayer.SetData("isDead", false); deadPlayer.SetData("reviveSperre", 5); + deadPlayer.TriggerEvent("enableSpawnschutz"); + dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 2).First().BankAccount.Balance += Medic.ReviveIncome; User u; diff --git a/ReallifeGamemode.Server/Commands/UserCommands.cs b/ReallifeGamemode.Server/Commands/UserCommands.cs index 15d159a7..f9718c59 100644 --- a/ReallifeGamemode.Server/Commands/UserCommands.cs +++ b/ReallifeGamemode.Server/Commands/UserCommands.cs @@ -16,7 +16,61 @@ using ReallifeGamemode.Services; namespace ReallifeGamemode.Server.Commands { internal class UserCommands : Script - { + { + [Command("eventport", "~m~eventport")] + public void CmdUserEventport(Player player, String option = "") + { + if (!player.IsLoggedIn()) return; + + if (option == "on") + { + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + return; + } + PositionManager.eventportPosition = player.Position; + PositionManager.eventportActive = true; + player.SendChatMessage("~y~Du hast hier erfolgreich einen Eventport gesetzt."); + return; + } + + if (option == "off") + { + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + return; + } + PositionManager.eventportActive = false; + player.SendChatMessage("~y~Du hast den Eventport deaktiviert."); + return; + } + + if (!PositionManager.eventportActive || PositionManager.eventportPosition == null) + { + player.SendChatMessage("~y~Im Moment ist kein Eventport aktiv."); + return; + } + + using (var dbContext = new DatabaseContext()) + { + User user = player.GetUser(dbContext); + if (user.Wanteds > 0 || user.JailTime > 0 || player.HasData("inGangWar") || !player.IsAlive()) + { + ChatService.ErrorMessage(player, "Momentan kannst du keinen Eventport nutzen"); + return; + } + } + + Random rnd = new Random(); + int randomX = rnd.Next(-3, 3); + int randomY = rnd.Next(-3, 3); + + Vector3 teleportPosition = new Vector3(PositionManager.eventportPosition.X + randomX, PositionManager.eventportPosition.Y + randomY, PositionManager.eventportPosition.Z); + + player.SafeTeleport(teleportPosition); + player.SendNotification("Du hast dich zum Event teleportiert"); + } + [Command("look", "~m~look")] public void CmdUserLook(Player player) { @@ -120,7 +174,7 @@ namespace ReallifeGamemode.Server.Commands } [Command("help", "~m~Benutzung: ~s~/help")] - public void CmdHelp(Player player) + public void CmdUserHelp(Player player) { player.SendChatMessage("E - Interagieren (ATM, Türen, Shops, Friseur etc."); player.SendChatMessage("M - Interaktionsmenü öffnen und schließen"); @@ -129,13 +183,13 @@ namespace ReallifeGamemode.Server.Commands player.SendChatMessage("O - Onlineliste öffnen / schließen"); player.SendChatMessage("I - Inventar öffnen / schließen"); player.SendChatMessage("F4 - Mikrofon an/aus schalten"); - player.SendChatMessage("/skill - Skillpunkte anzeigen"); + player.SendChatMessage("/report - Support-Anfrage"); } [Command("hup")] - public void CmdAnim(Player player) + public void CmdUserHup(Player player) { - player.ToggleSurrender(); + player.CheckToggleSurrender(); } [Command("event", "~m~Benutzung: ~s~/event [Nachricht]", GreedyArg = true)] diff --git a/ReallifeGamemode.Server/Events/Connect.cs b/ReallifeGamemode.Server/Events/Connect.cs index 9a235a20..485a13b4 100644 --- a/ReallifeGamemode.Server/Events/Connect.cs +++ b/ReallifeGamemode.Server/Events/Connect.cs @@ -77,6 +77,8 @@ namespace ReallifeGamemode.Server.Events player.TriggerEvent("CLIENT:AddPed", 2, "player_two", 1706.76953125, 3277.220947265625, 41.1555061340332, -159.447998046875, 0, false, true, 0, "none", true, true, true);//Ped_Pilot Sandyshores player.TriggerEvent("CLIENT:AddPed", 3, "s_m_m_pilot_01", -1621.4542236328125, -3152.724365234375, 13.991769790649414, 50.73009490966797, 0, false, true, 0, "none", true, true, true);//Ped_Pilot LS Airport player.TriggerEvent("CLIENT:AddPed", 4, "u_m_o_finguru_01", -534.4425659179688, -2145.747314453125, 5.992100715637207, 53.96156692504883, 0, false, true, 0, "none", true, true, true);//Ped Busfahrer + player.TriggerEvent("CLIENT:AddPed", 5, "csb_prolsec", 1690.84, 2591.17 , 45.91, -2.66, 0, false, true, 0, "none", true, true, true);//Ped Knast + TimeSpan currentTime = TimeManager.CurrentTime; bool disableLightMode = currentTime > LightModeTimeFrom && currentTime < LightModeTimeTo; diff --git a/ReallifeGamemode.Server/Events/Death.cs b/ReallifeGamemode.Server/Events/Death.cs index e935582b..c41bbb90 100644 --- a/ReallifeGamemode.Server/Events/Death.cs +++ b/ReallifeGamemode.Server/Events/Death.cs @@ -27,7 +27,6 @@ namespace ReallifeGamemode.Server.Events { private readonly Dictionary lastPlayerDeathTime = new Dictionary(); - [ServerEvent(Event.PlayerDeath)] public void OnPlayerDeath(Player player, Player killer, uint reason) { @@ -49,6 +48,7 @@ namespace ReallifeGamemode.Server.Events User user = player.GetUser(dbContext); PositionManager.cuffPoints.Remove(player); + player.TriggerEvent("abortSpawnschutz"); //TODO: Zum Full Release entfernen if (player.HasData("togdeath")) @@ -114,14 +114,41 @@ namespace ReallifeGamemode.Server.Events }; dbContext.DeathLogs.Add(dead); - bool copNearby = NAPI.Pools.GetAllPlayers().Any(u => u.IsDuty() && u.IsAlive() && u.Position.DistanceToSquared(player.Position) <= 200 * 200); + player.ClearAnimation(); + player.ClearAttachments(); + List fItem = dbContext.UserItems.Where(u => u.UserId == user.Id).ToList(); + foreach (var item in fItem) + { + IItem iItem = InventoryManager.GetItemById(item.ItemId); + if (iItem is IWeaponDealItem obj) + { + int amount = item.Amount; - if (user.Wanteds > 0) + Vector3 dropPosition = PlayerExtension.GetPositionFromPlayer(player, 0.6f, 0); + //new Vector3(player.Position.X, player.Position.Y, player.Position.Z - 0.8f); + Random r = new Random(); + GTANetworkAPI.Object grndObject; + Vector3 textPos = dropPosition; + + dropPosition.Z -= 1.05f; + grndObject = NAPI.Object.CreateObject(3666746839, dropPosition, new Vector3(0, 0, r.Next(0, 360)), 255, 0); + + GroundItem grndItem = new GroundItem { ItemId = iItem.Id, Amount = amount, Position = dropPosition }; + TextLabel grndTxtLbl = NAPI.TextLabel.CreateTextLabel(iItem.Name + " ~s~(~y~" + amount + "~s~)", textPos, 5, 0.5f, 4, new Color(255, 255, 255), false, 0); + GroundItem.AddGroundItem(grndItem, grndObject, grndTxtLbl); + + dbContext.Remove(item); + } + } + + bool copNearby = NAPI.Pools.GetAllPlayers().Any(u => u.IsDuty() && u.IsAlive() && u.Position.DistanceToSquared(player.Position) <= 100 * 100); + + if (user.Wanteds > 0 && (!player.HasData("GotInsideOfTurf") || !player.GetData("GotInsideOfTurf"))) { if (copNearby) { - user.SetJailTime(true); - Jail.Check_PutBehindBars(user); + user.SetJailTime(true, dbContext); + Jail.Check_PutBehindBars(user, "cell"); ChatService.HQMessage(user.Name + " wurde ins Gefängnis eingeliefert."); } else @@ -136,7 +163,7 @@ namespace ReallifeGamemode.Server.Events { user.Dead = true; - if (!player.HasData("reviveSperre") && player.GetData("isDead") == false && !player.HasData("inGangWar") && player.GetData("SAdminduty") == false) + if (user.Wanteds == 0 && !player.HasData("reviveSperre") && player.GetData("isDead") == false && !player.HasData("inGangWar") && player.GetData("SAdminduty") == false) { //MEDIC AUFTRAG MedicTask reviveTask = new MedicTask() @@ -166,83 +193,32 @@ namespace ReallifeGamemode.Server.Events } //TODO PICTURE NOTIFICATION + SOUND für Medics - - player.ClearAttachments(); - List fItem = dbContext.UserItems.Where(u => u.UserId == user.Id).ToList(); - foreach (var item in fItem) - { - IItem iItem = InventoryManager.GetItemById(item.ItemId); - if (iItem is IWeaponDealItem obj) - { - int amount = item.Amount; - - Vector3 dropPosition = PlayerExtension.GetPositionFromPlayer(player, 0.6f, 0); - //new Vector3(player.Position.X, player.Position.Y, player.Position.Z - 0.8f); - Random r = new Random(); - GTANetworkAPI.Object grndObject; - Vector3 textPos = dropPosition; - - dropPosition.Z -= 1.05f; - grndObject = NAPI.Object.CreateObject(3666746839, dropPosition, new Vector3(0, 0, r.Next(0, 360)), 255, 0); - - GroundItem grndItem = new GroundItem { ItemId = iItem.Id, Amount = amount, Position = dropPosition }; - TextLabel grndTxtLbl = NAPI.TextLabel.CreateTextLabel(iItem.Name + " ~s~(~y~" + amount + "~s~)", textPos, 5, 0.5f, 4, new Color(255, 255, 255), false, 0); - GroundItem.AddGroundItem(grndItem, grndObject, grndTxtLbl); - - player.ClearAnimation(); - - dbContext.Remove(item); - } - } } Job.JobBase job = Managers.JobManager.GetJob(player.GetUser().JobId ?? -1); if (job != null) { - //ChatService.SendMessage(player, "Debug1"); if (job.GetUsersInJob().Contains(player)) { - //ChatService.SendMessage(player, "Debug2"); if (player.Vehicle != null) { - //ChatService.SendMessage(player, "Debug3"); - /*if (player.Vehicle.GetData("timerJobVehicleRespawn") == true) - {*/ if (player.Vehicle.GetServerVehicle() is JobVehicle vehJ) { - //ChatService.SendMessage(player, "Debug4"); player.Vehicle.ResetData("timerJobVehicleRespawn"); ServerVehicle sVeh = Managers.VehicleManager.GetServerVehicleFromVehicle(player.Vehicle); ServerVehicleExtensions.Spawn(sVeh, player.Vehicle); } - else - { - //ChatService.SendMessage(player, "Debug5"); - } - //} } if (Managers.JobManager.playerTimersJobVehicleRespawn.ContainsKey(player)) { - //ChatService.SendMessage(player, "Debug6"); Managers.JobManager.playerTimersJobVehicleRespawn[player].Stop(); } - //ChatService.SendMessage(player, "Debug7"); - player.ResetData("PilotenBase"); job.StopJob(player); ChatService.SendMessage(player, $"~y~[JOB]~s~ Du hast deinen Job ~o~{job.Name}~s~ beendet."); if (player.GetData("HatRoute") == true) { - //ChatService.SendMessage(player, "Debug8"); CheckPointHandle.DeleteCheckpoints(player); player.ResetData("HatRoute"); } - else - { - //ChatService.SendMessage(player, "Debug9"); - } - } - else - { - //ChatService.SendMessage(player, "Debug10"); } } dbContext.SaveChanges(); @@ -269,6 +245,8 @@ namespace ReallifeGamemode.Server.Events } player.SafeTeleport(new Vector3(-495.45, -336.33, 34.5), 0, true); + + player.TriggerEvent("enableSpawnschutz"); } } } diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 92a7af80..f15ad483 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -308,6 +308,7 @@ namespace ReallifeGamemode.Server.Events user.SetData("duty", true); player.SendNotification("Du bist nun ~g~im Dienst."); player.TriggerEvent("toggleDutyMode", true); + player.TriggerEvent("abortSpawnschutz"); if (player.GetUser().FactionId == 2) //Fire Department { Medic.UpdateDutyMedics(); @@ -627,10 +628,9 @@ namespace ReallifeGamemode.Server.Events if(player.GetData("SellVehicleDecision") == true && player.HasData("VehicleToSell")) { - InteractionManager.SellPlayerVehicle(player, player.GetData("VehicleToSell")); + InteractionManager.SellServerVehicle(player, player.GetData("VehicleToSell")); player.ResetData("SellVehicleDecision"); - player.ResetData("VehicleToSell"); - player.SendNotification("~g~Du hast dein Fahrzeug verkauft"); + player.ResetData("VehicleToSell"); return; } @@ -904,7 +904,7 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("keyPress:ControllH")] public void KeyPressControllH(Player player) { - player.ToggleSurrender(); + player.CheckToggleSurrender(); } #endregion User Key diff --git a/ReallifeGamemode.Server/Events/Login.cs b/ReallifeGamemode.Server/Events/Login.cs index 197ccbdc..639baff4 100644 --- a/ReallifeGamemode.Server/Events/Login.cs +++ b/ReallifeGamemode.Server/Events/Login.cs @@ -100,7 +100,12 @@ namespace ReallifeGamemode.Server.Events if (user.Wanteds > 0) { - ChatService.HQMessage("Der Straftäter" + user.Name + " hat sich mit " + user.Wanteds + " Wanteds eingeloggt."); + ChatService.HQMessage("Der Straftäter " + user.Name + " hat sich mit " + user.Wanteds + " Wanteds eingeloggt."); + } + + if (user.Wanteds == 0) + { + player.TriggerEvent("enableSpawnschutz"); } if (user.Group != null) @@ -159,7 +164,7 @@ namespace ReallifeGamemode.Server.Events } else { - Jail.Check_PutBehindBars(user); + Jail.Check_PutBehindBars(user, "cell"); } player.Dimension = 0; diff --git a/ReallifeGamemode.Server/Events/PlayerEvent.cs b/ReallifeGamemode.Server/Events/PlayerEvent.cs index 886d25fe..06ab2550 100644 --- a/ReallifeGamemode.Server/Events/PlayerEvent.cs +++ b/ReallifeGamemode.Server/Events/PlayerEvent.cs @@ -3,11 +3,16 @@ using System.Collections.Generic; using System.Text; using GTANetworkAPI; using ReallifeGamemode.Server.Extensions; +using ReallifeGamemode.Server.Services; namespace ReallifeGamemode.Server.Events { internal class PlayerEvent : Script { + [ServerEvent(Event.PlayerDamage)] + public void OnPlayerDamage(Player player, float healthLoss, float armorLoss){ + } + [RemoteEvent("CLIENT:SET_InFrontOfPos")] public void SetFrontOfPos(Player player, Vector3 pos) { @@ -23,5 +28,11 @@ namespace ReallifeGamemode.Server.Events player.SendNotification("Du wurdest ~b~AFK~s~ gesetzt", true); } } + + [RemoteEvent("CLIENT:Handsup_TogglePlayerHup")] + public void PlayerToggleHandsupEvent(Player player) + { + player.ToggleSurrender(); + } } } diff --git a/ReallifeGamemode.Server/Events/Register.cs b/ReallifeGamemode.Server/Events/Register.cs index 37baf622..c736a54f 100644 --- a/ReallifeGamemode.Server/Events/Register.cs +++ b/ReallifeGamemode.Server/Events/Register.cs @@ -29,9 +29,9 @@ namespace ReallifeGamemode.Server.Events player.TriggerEvent("SERVER:Login_Error", "Das Passwort muss aus mindestens 6 Zeichen bestehen."); return; } - if (dbContext.Users.Where(u => u.SocialClubName == player.SocialClubName).Count() >= 3) + if (dbContext.Users.Where(u => u.SocialClubName == player.SocialClubName).Count()!= 0) { - player.TriggerEvent("SERVER:Login_Error", "Es sind schon 3 Konten mit dieser Socialclub-ID registriert."); + player.TriggerEvent("SERVER:Login_Error", "Es ist schon ein Konto mit dieser Socialclub-ID registriert."); return; } diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index 3a665dd0..56f0d4f7 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -88,7 +88,7 @@ namespace ReallifeGamemode.Server.Extensions player.Armor = armor; } - public static void SetJailTime(this User user, bool killed) + public static void SetJailTime(this User user, bool killed, DatabaseContext dbContext) { if (user == null) { @@ -101,6 +101,13 @@ namespace ReallifeGamemode.Server.Extensions time *= 2; } + int factionMoney = user.Wanteds * 6; + var executiveFactions = dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 1 || f.Id == 3); + foreach(var faction in executiveFactions) + { + faction.BankAccount.Balance += factionMoney; + } + user.Wanteds = 0; user.JailTime = time; } @@ -138,7 +145,7 @@ namespace ReallifeGamemode.Server.Extensions public static bool IsAfk(this Player player) { - if(!player.HasSharedData("isAfk")) + if (!player.HasSharedData("isAfk")) { return false; } @@ -339,7 +346,7 @@ namespace ReallifeGamemode.Server.Extensions int nameTagColor = 0; Player player = user.Player; - if(player == null || !player.IsLoggedIn()) + if (player == null || !player.IsLoggedIn()) { return; } @@ -347,7 +354,7 @@ namespace ReallifeGamemode.Server.Extensions bool duty = user.GetData("duty"); bool adminUnshow = user.GetData("adminUnshow"); - if(adminUnshow) + if (adminUnshow) { blipColor = -1; nameTagColor = -3; @@ -437,6 +444,11 @@ namespace ReallifeGamemode.Server.Extensions } } + public static void CheckToggleSurrender(this Player player) + { + player.TriggerEvent("SERVER:Handsup_CheckIfPlayerCanHandsup"); + } + public static void ToggleSurrender(this Player player) { if (player.HasAnimation("hup")) diff --git a/ReallifeGamemode.Server/Extensions/ServerVehicleExtensions.cs b/ReallifeGamemode.Server/Extensions/ServerVehicleExtensions.cs index 5e4c3c38..170b9681 100644 --- a/ReallifeGamemode.Server/Extensions/ServerVehicleExtensions.cs +++ b/ReallifeGamemode.Server/Extensions/ServerVehicleExtensions.cs @@ -15,19 +15,32 @@ namespace ReallifeGamemode.Server.Extensions public static Vehicle GetVehicle(this ServerVehicle veh) => VehicleManager.GetVehicleFromServerVehicle(veh); - public static Vehicle Spawn(this ServerVehicle veh, Vehicle currentVeh = null) + public static Vehicle Spawn(this ServerVehicle veh, Vehicle currentVeh) { - if (currentVeh != null) VehicleManager.DeleteVehicle(currentVeh); + if (currentVeh == null) + { + currentVeh = VehicleManager.GetVehicleFromServerVehicle(veh); + } + + if(currentVeh != null) + { + VehicleManager.DeleteVehicle(currentVeh); + } + Vector3 position = veh.Position; uint model = (uint)veh.Model; float heading = veh.Heading; int c1 = veh.PrimaryColor; int c2 = veh.SecondaryColor; + Vehicle newVeh = NAPI.Vehicle.CreateVehicle(model, position, heading, c1, c2, "", 255, false, false); + veh.Livery = veh.Livery; VehicleStreaming.SetEngineState(newVeh, false); VehicleStreaming.SetLockStatus(newVeh, veh.Locked); + VehicleManager.AddVehicle(veh, newVeh); + newVeh.Rotation = new Vector3(0, 0, heading); newVeh.SetSharedData("drivenDistance", veh.DistanceDriven); @@ -71,6 +84,7 @@ namespace ReallifeGamemode.Server.Extensions { numberplate = "NV" + numberplate; } + NAPI.Vehicle.SetVehicleNumberPlate(newVeh, numberplate); veh.NumberPlate = numberplate; diff --git a/ReallifeGamemode.Server/Factions/BasePoints.cs b/ReallifeGamemode.Server/Factions/BasePoints.cs index bff3a90d..02f9eccc 100644 --- a/ReallifeGamemode.Server/Factions/BasePoints.cs +++ b/ReallifeGamemode.Server/Factions/BasePoints.cs @@ -33,7 +33,7 @@ namespace ReallifeGamemode.Server.WeaponDeal } else if (factionID == 5) { - client.TriggerEvent("SERVER:Util_setWaypoint", 1157.56, -1518.56); // Terror + client.TriggerEvent("SERVER:Util_setWaypoint", -1082.29, -1655.07); // Terror } else if (factionID == 6) { diff --git a/ReallifeGamemode.Server/Factions/Medic/Medic.cs b/ReallifeGamemode.Server/Factions/Medic/Medic.cs index 50ef6941..1bc98dcd 100644 --- a/ReallifeGamemode.Server/Factions/Medic/Medic.cs +++ b/ReallifeGamemode.Server/Factions/Medic/Medic.cs @@ -195,6 +195,21 @@ namespace ReallifeGamemode.Server.Factions.Medic } } + public static void RemoveOldHealTask() + { + if (HealTasks.Count != 0) + { + foreach (var task in HealTasks.ToList()) + { + var taskActive = DateTime.Now - task.Time; + if (taskActive > TimeSpan.FromMinutes(10) && task.MedicName == "none") + { + delHealTask(PlayerService.GetPlayerByNameOrId(task.Victim)); + } + } + } + } + [RemoteEvent("loadMedicTasks")] public void LoadMedicTasks(Player player, int type) { diff --git a/ReallifeGamemode.Server/Finance/Economy.cs b/ReallifeGamemode.Server/Finance/Economy.cs index 391704e2..4bf28832 100644 --- a/ReallifeGamemode.Server/Finance/Economy.cs +++ b/ReallifeGamemode.Server/Finance/Economy.cs @@ -44,11 +44,31 @@ namespace ReallifeGamemode.Server.Finance foreach (UserVehicle uVeh in dbContext.UserVehicles.Where(u => u.UserId == user.Id)) { if (uVeh.Price == null) - { vehicleTaxation += 400; - continue; - } - vehicleTaxation += (int)(uVeh.Price * 0.005f); + else + vehicleTaxation += (int)(uVeh.Price * 0.0015f); + + int taxation = uVeh.BusinessId switch + { + 3 => 75, /// + 4 => 200, /// + 5 => 150, /// + 6 => 150, /// + 7 => 150, /// + 8 => 50, /// + 9 => 20, /// + 10 => 50, /// + 11 => 100, /// + 12 => 50, /// + 13 => 100, /// + 14 => 200, /// + _ => 0, + }; + + if (taxation is 0) + Console.WriteLine($"[FINANCE] USER: {user.Name} ({user.Id}) has no BusinessId on UserVehicle ({uVeh.Id})"); + + vehicleTaxation += taxation; } } return vehicleTaxation; @@ -180,7 +200,7 @@ namespace ReallifeGamemode.Server.Finance if (putInJail != 0 && minusJail) { - Jail.Check_PutBehindBars(u); + Jail.Check_PutBehindBars(u, "cell"); } } @@ -189,13 +209,13 @@ namespace ReallifeGamemode.Server.Finance using var dbContext = new DatabaseContext(); foreach (var player in NAPI.Pools.GetAllPlayers().Where(p => p.IsLoggedIn())) { - if(player.IsAfk()) + if (player.IsAfk()) { continue; } User user = player.GetUser(dbContext); - if(user == null) + if (user == null) { continue; } diff --git a/ReallifeGamemode.Server/Gangwar/Gangwar.cs b/ReallifeGamemode.Server/Gangwar/Gangwar.cs index 2f03c031..56d7f42d 100644 --- a/ReallifeGamemode.Server/Gangwar/Gangwar.cs +++ b/ReallifeGamemode.Server/Gangwar/Gangwar.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using GTANetworkAPI; using Newtonsoft.Json; @@ -145,7 +145,7 @@ namespace ReallifeGamemode.Server.Gangwar int id = JsonConvert.DeserializeObject(jsonId); if (id == -1) { - ChatService.ErrorMessage(client, "Du befindest dich in keinem Gebiet!"); + ChatService.ErrorMessage(client, "Du befindest dich in keinem Gebiet"); return; } using (var dbContext = new DatabaseContext()) diff --git a/ReallifeGamemode.Server/Gangwar/Turf.cs b/ReallifeGamemode.Server/Gangwar/Turf.cs index 809af885..9d6e011e 100644 --- a/ReallifeGamemode.Server/Gangwar/Turf.cs +++ b/ReallifeGamemode.Server/Gangwar/Turf.cs @@ -217,8 +217,8 @@ namespace ReallifeGamemode.Server.Gangwar { using (var dbContext = new DatabaseContext()) { - ChatService.BroadcastFaction("~y~[GANGWAR] ~r~" + client.Name + "~w~ ist nicht im Gangwar beteiligt !", dbContext.Factions.Where(f => f.Name == getOwner()).FirstOrDefault()); - ChatService.BroadcastFaction("~y~[GANGWAR] ~r~" + client.Name + "~w~ ist nicht im Gangwar beteiligt !", dbContext.Factions.Where(f => f.Name == getAttacker()).FirstOrDefault()); + ChatService.BroadcastFaction("~y~[GANGWAR] ~r~" + client.Name + "~w~ ist nicht im Gangwar beteiligt!", dbContext.Factions.Where(f => f.Name == getOwner()).FirstOrDefault()); + ChatService.BroadcastFaction("~y~[GANGWAR] ~r~" + client.Name + "~w~ ist nicht im Gangwar beteiligt!", dbContext.Factions.Where(f => f.Name == getAttacker()).FirstOrDefault()); } return; } @@ -259,10 +259,13 @@ namespace ReallifeGamemode.Server.Gangwar return; } + string takeOverMessage = string.Empty; + if (getOwner() == FactionName) { - ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion hat erfolgreich das Gebiet ~g~" + getName() + "~w~ verteidigt.", ownerFaction); - ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion hat den Angrif auf das Gebiet ~r~" + getName() + "~w~ verloren.", attackerFaction); + takeOverMessage = $"~y~[GANGWAR] ~w~Die {getOwner()} konnten ihr Gebiet ~g~{getName()} ~w~ erfolgreich gegen die {getAttacker()} verteidigen."; + //ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion hat erfolgreich das Gebiet ~g~" + getName() + "~w~ verteidigt.", ownerFaction); + //ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion hat den Angrif auf das Gebiet ~r~" + getName() + "~w~ verloren.", attackerFaction); foreach (var o in owners) { @@ -276,8 +279,9 @@ namespace ReallifeGamemode.Server.Gangwar } else if (getOwner() != FactionName) { - ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion konnte das Gebiet ~r~" + getName() + "~w~ nicht verteidigen.", ownerFaction); - ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion konnte erfolgreich das Gebiet ~g~" + getName() + "~w~ erobern.", attackerFaction); + takeOverMessage = $"~y~[GANGWAR] ~w~Die {getAttacker()} konnten das Gebiet ~g~{getName()} ~w~ der {getAttacker()} erfolgreich erobern."; + //ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion konnte das Gebiet ~r~" + getName() + "~w~ nicht verteidigen.", ownerFaction); + //ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion konnte erfolgreich das Gebiet ~g~" + getName() + "~w~ erobern.", attackerFaction); foreach (var o in owners) { if (o != null) @@ -294,6 +298,7 @@ namespace ReallifeGamemode.Server.Gangwar turf.Owner = this.Owner; turf.FactionId = attackerFaction.Id; } + ChatService.Broadcast(takeOverMessage); dbContext.SaveChanges(); } this.Attacker = null; @@ -332,7 +337,7 @@ namespace ReallifeGamemode.Server.Gangwar List leaders = context.Users.Include(u => u.Faction).Where(u => onlinePlayers.Contains(u.Name) && u.Faction.Name == attacker && u.FactionLeader).Select(u => u.Player).ToList(); foreach (var l in leaders) { - ChatService.ErrorMessage(l, "Gangwarstart ist nicht möglich, da die beteiligten Fraktionen nicht genügend Mitglieder aufweisen."); + ChatService.ErrorMessage(l, "Du kannst keinen Gangwar starten, weil in der gegnerischen Fraktion zu wenig Spieler online sind"); } return; @@ -358,9 +363,11 @@ namespace ReallifeGamemode.Server.Gangwar u.TriggerEvent("CLIENT:setAttackBlip", true, TurfID); u.TriggerEvent("GangwarScore", this.Attacker, this.Owner, this.Att_Score, this.Def_Score); u.SetData("inGangWar", getId()); - ChatService.SendMessage(u, "~y~[GANGWAR]~w~ Die " + getAttacker() + " haben das Gebiet ~y~" + TurfName + "~w~ der " + getOwner() + " angegriffen."); clientsInGangwar.Add(u); } + + ChatService.Broadcast("~y~[GANGWAR]~w~ Die " + getAttacker() + " haben das Gebiet ~y~" + TurfName + "~w~ der " + getOwner() + " angegriffen."); + playerInGangwar = clientsInGangwar.ToArray(); NAPI.ClientEvent.TriggerClientEventForAll("CLIENT:Turf_Update", JsonConvert.SerializeObject(this.TurfID), JsonConvert.SerializeObject(this.status), JsonConvert.SerializeObject(this.Owner), JsonConvert.SerializeObject(this.Attacker)); this.TurfTick(); diff --git a/ReallifeGamemode.Server/Inventory/Items/ConsumableItem.cs b/ReallifeGamemode.Server/Inventory/Items/ConsumableItem.cs index 26248d69..d5a96232 100644 --- a/ReallifeGamemode.Server/Inventory/Items/ConsumableItem.cs +++ b/ReallifeGamemode.Server/Inventory/Items/ConsumableItem.cs @@ -28,33 +28,35 @@ namespace ReallifeGamemode.Server.Inventory.Items if (user.Player == null || !user.Player.IsLoggedIn()) return false; - if (InventoryManager.itemCooldown.ContainsKey(user.Player)) + if (!HasCooldownElapsed(user)) { - PlayerTimer timer = InventoryManager.itemCooldown[user.Player]; - int timeToNextUse = (int)(timer.startTime - DateTime.Now).TotalSeconds; - uItem.GetUser().Player.TriggerEvent("Error", $"Versuche es nach {timeToNextUse} Sekunden erneut."); + DateTime time = InventoryManager.itemCooldown[user.Id]; + int timeUntillNextUse = (int)(time - DateTime.Now).TotalSeconds; + uItem.GetUser().Player.TriggerEvent("Error", $"Versuche es nach {timeUntillNextUse} Sekunden erneut."); return false; } - PlayerTimer playerTimer = new PlayerTimer(user.Player, this, Cooldown); - playerTimer.Elapsed += _CooldownElapse; - InventoryManager.itemCooldown.Add(user.Player, playerTimer); + + DateTime cooldown = DateTime.Now.AddMilliseconds(Cooldown); + InventoryManager.itemCooldown.Add(user.Id, cooldown); + Consume(uItem); return true; } - private void _CooldownElapse(Player player, dynamic usableItem) + private bool HasCooldownElapsed(User user) { - NAPI.Task.Run(() => - { - if (player == null || !player.IsLoggedIn()) - return; + if (user.Player == null || !user.Player.IsLoggedIn()) + return false; - if (!InventoryManager.itemCooldown.ContainsKey(player)) - return; + if (!InventoryManager.itemCooldown.ContainsKey(user.Id)) + return true; - InventoryManager.itemCooldown[player].Stop(); - InventoryManager.itemCooldown.Remove(player); - }); + int timeRemaining = (int)(InventoryManager.itemCooldown[user.Id] - DateTime.Now).TotalSeconds; + + if (timeRemaining <= 0) + InventoryManager.itemCooldown.Remove(user.Id); + + return timeRemaining <= 0; } } } diff --git a/ReallifeGamemode.Server/Job/BusDriverJob.cs b/ReallifeGamemode.Server/Job/BusDriverJob.cs index 5a596644..e6261780 100644 --- a/ReallifeGamemode.Server/Job/BusDriverJob.cs +++ b/ReallifeGamemode.Server/Job/BusDriverJob.cs @@ -35,7 +35,7 @@ namespace ReallifeGamemode.Server.Job public const int WAGE_BEGINNER = 400; public const int WAGE_INTERMEDIATE = 600; - public const int WAGE_PROFESSIOAL = 900; + public const int WAGE_PROFESSIOAL = 650; public const string BEGINNER = "Anfänger"; public const string INTERMEDIATE = "Fortgeschrittener"; @@ -424,13 +424,13 @@ namespace ReallifeGamemode.Server.Job player.TriggerEvent("CLIENT:PlaySound", "jobs/busfahrer/FahrplanAbfahrt", "wav", 15); player.StartCheckPointRoute(selectedRoute, MARKER_DELAY, MARKER_ID, MARKER_SIZE, MARKER_DIST, true, MARKER_EVENT); if (index != -1) - player.SendChatMessage($"~y~[JOB]: ~w~Dir wurde ~g~ Route {index + 1}~w~ zugeteilt."); + player.SendChatMessage($"~y~[JOB] ~w~Dir wurde ~g~ Route {index + 1}~w~ zugeteilt."); } public override void LastCheckpoint(Player player) { Vehicle v = player.Vehicle; - player.SendChatMessage("~y~[JOB]: ~w~Die neue Route lädt. Bitte warten..."); + player.SendChatMessage("~y~[JOB] ~w~Die neue Route lädt. Bitte warten..."); string type = getPlayerRouteType(player); if (type == BEGINNER) @@ -617,11 +617,18 @@ namespace ReallifeGamemode.Server.Job return; if (BusDriverJob.playerVehiclePair[player].Model is BusDriverJob.VEHICLE_BEGINNER) + { payWage(player, BusDriverJob.WAGE_BEGINNER / BusDriverJob.playerRouteCurrent[player.Name].Count); + } else if (BusDriverJob.playerVehiclePair[player].Model is BusDriverJob.VEHICLE_INTERMEDIATE) + { payWage(player, BusDriverJob.WAGE_INTERMEDIATE / BusDriverJob.playerRouteCurrent[player.Name].Count); + payWage(player, 0); + } else if (BusDriverJob.playerVehiclePair[player].Model is BusDriverJob.VEHICLE_PROFESSIONAL) + { payWage(player, BusDriverJob.WAGE_PROFESSIOAL / BusDriverJob.playerRouteCurrent[player.Name].Count); + } } public static void payWage(Player player, int wage) @@ -635,13 +642,13 @@ namespace ReallifeGamemode.Server.Job user.BusSkill++; if (user.BusSkill == BusDriverJob.SKILL_INTERMEDIATE) { - player.SendChatMessage($"~y~[JOB]: ~w~Du hast nun die Route ~g~{BusDriverJob.INTERMEDIATE} ~w~freigeschaltet!"); - player.SendChatMessage($"~y~[JOB]: ~w~Du kannst jetzt auch mit dem Coach fahren!"); + player.SendChatMessage($"~y~[JOB] ~w~Du hast nun die Route ~g~{BusDriverJob.INTERMEDIATE} ~w~freigeschaltet!"); + player.SendChatMessage($"~y~[JOB] ~w~Du kannst jetzt auch mit dem Coach fahren!"); } if (user.BusSkill == BusDriverJob.SKILL_PROFESSIONAL) { - player.SendChatMessage($"~y~[JOB]: ~w~Du hast nun die Route ~g~{BusDriverJob.PROFESSIONAL} ~w~freigeschaltet!"); - player.SendChatMessage($"~y~[JOB]: ~w~Du kannst jetzt auch mit dem Tourbus fahren!"); + player.SendChatMessage($"~y~[JOB] ~w~Du hast nun die Route ~g~{BusDriverJob.PROFESSIONAL} ~w~freigeschaltet!"); + player.SendChatMessage($"~y~[JOB] ~w~Du kannst jetzt auch mit dem Tourbus fahren!"); } dbContext.SaveChanges(); diff --git a/ReallifeGamemode.Server/Job/JobBase.cs b/ReallifeGamemode.Server/Job/JobBase.cs index 8a0baa0b..9c760574 100644 --- a/ReallifeGamemode.Server/Job/JobBase.cs +++ b/ReallifeGamemode.Server/Job/JobBase.cs @@ -45,7 +45,7 @@ namespace ReallifeGamemode.Server.Job _inJob.Add(player); jobPlayer.Add(player); - ChatService.SendMessage(player, $"~y~[Job]~s~ Du hast deinen Job ~o~{this.Name}~s~ gestartet."); + ChatService.SendMessage(player, $"~y~[JOB]~s~ Du hast deinen Job ~o~{this.Name}~s~ gestartet."); JobStart?.Invoke(player); } @@ -58,7 +58,7 @@ namespace ReallifeGamemode.Server.Job if (quit) { - ChatService.SendMessage(player, $"~y~[Job]~s~ Du hast deinen Job ~o~{this.Name}~s~ beendet."); + ChatService.SendMessage(player, $"~y~[JOB]~s~ Du hast deinen Job ~o~{this.Name}~s~ beendet."); player.SafeTeleport(JobManager.playerJobStartPosition[player]); } diff --git a/ReallifeGamemode.Server/Job/PilotJob.cs b/ReallifeGamemode.Server/Job/PilotJob.cs index 66751a43..98b5a729 100644 --- a/ReallifeGamemode.Server/Job/PilotJob.cs +++ b/ReallifeGamemode.Server/Job/PilotJob.cs @@ -25,7 +25,7 @@ namespace ReallifeGamemode.Server.Job public const string PROFESSIONAL = "Profi"; public const int WAGE_BEGINNER = 300; - public const int WAGE_INTERMEDIATE = 750; + public const int WAGE_INTERMEDIATE = 900; public const uint VEHICLE_BEGINNER = (uint)VehicleHash.Cuban800; public const uint VEHICLE_INTERMEDIATE = (uint)VehicleHash.Velum2; @@ -345,7 +345,7 @@ namespace ReallifeGamemode.Server.Job payWage(player, PilotJob.WAGE_INTERMEDIATE / PilotJob.playerRouteCurrent[player.Name].Count); } - private void payWage(Player player, int wage) + public void payWage(Player player, int wage) { using var dbContext = new DatabaseContext(); User user = player.GetUser(dbContext); @@ -356,8 +356,8 @@ namespace ReallifeGamemode.Server.Job user.PilotSkill++; if (user.PilotSkill == BusDriverJob.SKILL_INTERMEDIATE) { - player.SendChatMessage($"~y~[JOB]: ~w~Du hast nun die Route ~g~{BusDriverJob.INTERMEDIATE} ~w~freigeschaltet!"); - player.SendChatMessage($"~y~[JOB]: ~w~Du kannst jetzt auch mit dem Velum fliegen!"); + player.SendChatMessage($"~y~[JOB] ~w~Du hast nun die Route ~g~{BusDriverJob.INTERMEDIATE} ~w~freigeschaltet!"); + player.SendChatMessage($"~y~[JOB] ~w~Du kannst jetzt auch mit dem Velum fliegen!"); } dbContext.SaveChanges(); diff --git a/ReallifeGamemode.Server/Job/RefuseCollectorJob.cs b/ReallifeGamemode.Server/Job/RefuseCollectorJob.cs index 7edf83be..cc187fc8 100644 --- a/ReallifeGamemode.Server/Job/RefuseCollectorJob.cs +++ b/ReallifeGamemode.Server/Job/RefuseCollectorJob.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using GTANetworkAPI; @@ -21,6 +21,8 @@ namespace ReallifeGamemode.Server.Job public override bool NeedVehicleToStart => false; private const int MAX_BAG = 40; + private const int WAGE = 80; + private const int BONUS = 10; public RefuseCollectorJob() { @@ -205,7 +207,7 @@ namespace ReallifeGamemode.Server.Job player.AddAttachment("binbag", true); } - ChatService.SendMessage(data.getPartnerClient(player), $"~y~[Job] ~s~Dein Partner hat den Job beendet."); + ChatService.SendMessage(data.getPartnerClient(player), $"~y~[JOB] ~s~Dein Partner hat den Job beendet."); data.removeClientFromData(player); return; @@ -254,10 +256,10 @@ namespace ReallifeGamemode.Server.Job if (data.getTrashCount() == MAX_BAG) { - ChatService.SendMessage((Player)player, "~y~[Job] ~s~Der Müllwagen ist voll. Fahre nun zurück zur Recyclinganlage!"); + 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."); + ChatService.SendMessage((Player)target, "~y~[JOB] ~s~Der Müllwagen ist voll! Er muss entleert werden."); target.TriggerEvent("SERVER:MuellmannZuBase"); } player.TriggerEvent("SERVER:MuellmannZuBase"); @@ -265,18 +267,18 @@ namespace ReallifeGamemode.Server.Job else if (data.getTrashCount() > MAX_BAG) { data.setTrashCount(MAX_BAG); - ChatService.ErrorMessage((Player)player, "Der Müllwagen ist schon voll."); + ChatService.ErrorMessage((Player)player, "Der Müllwagen ist schon voll"); } else { if (target != null) { - user1.Wage += 25; - user2.Wage += 25; + user1.Wage += WAGE / 2; + user2.Wage += WAGE / 2; } else { - user1.Wage += 50; + user1.Wage += WAGE; } dbContext.SaveChanges(); } @@ -294,15 +296,15 @@ 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: {data.getTrashCount()}"); - ChatService.SendMessage((Player)player, $"~y~[Job] ~s~Fahrzeug wurde entleert. Säcke: {data.getTrashCount()}"); + 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(); + int bonus = BONUS * data.getTrashCount(); if (target != null) { @@ -384,8 +386,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}!"); return; } } @@ -401,8 +403,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/Managers/BusinessManager.cs b/ReallifeGamemode.Server/Managers/BusinessManager.cs index 77ad2d06..6507ea0b 100644 --- a/ReallifeGamemode.Server/Managers/BusinessManager.cs +++ b/ReallifeGamemode.Server/Managers/BusinessManager.cs @@ -168,13 +168,13 @@ namespace ReallifeGamemode.Server.Managers player.TriggerEvent("SERVER:Util_setWaypoint", spawnPos.X, spawnPos.Y); - User u = player.GetUser(dbContext); + User user = player.GetUser(dbContext); ServerVehicle newVeh = null; if (target == "Spieler") { - TransactionResult result = BankManager.TransferMoney(u, business, price, "Auto gekauft", dbContext); + TransactionResult result = BankManager.TransferMoney(user, business, price, "Auto gekauft", dbContext); if (result == TransactionResult.SENDER_NOT_ENOUGH_MONEY) { player.SendNotification("~r~Du hast nicht genug Geld: " + price.ToMoneyString()); @@ -190,17 +190,18 @@ namespace ReallifeGamemode.Server.Managers PositionY = spawnPos.Y, PositionZ = spawnPos.Z, Locked = false, - UserId = player.GetUser().Id, + UserId = user.Id, Model = shopVehicle.Model, PrimaryColor = 111, SecondaryColor = 111, Active = true, Price = price, + BusinessId = business.Id }; } else if (target == "Fraktion") { - var faction = dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == u.FactionId).First(); + var faction = dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == user.FactionId).First(); TransactionResult result = BankManager.TransferMoney(faction, business, (int)(price * FACTION_CAR_MULTIPLIER), "Auto gekauft", dbContext); if (result == TransactionResult.SENDER_NOT_ENOUGH_MONEY) { @@ -216,7 +217,7 @@ namespace ReallifeGamemode.Server.Managers PositionY = spawnPos.Y, PositionZ = spawnPos.Z, Locked = false, - Owners = JsonConvert.SerializeObject(new int[] { player.GetUser(dbContext).FactionId.Value }), + Owners = JsonConvert.SerializeObject(new int[] { user.FactionId.Value }), Model = shopVehicle.Model, PrimaryColor = 111, SecondaryColor = 111, @@ -243,7 +244,7 @@ namespace ReallifeGamemode.Server.Managers dbContext.ServerVehicles.Add(newVeh); dbContext.SaveChanges(); - newVeh.Spawn(); + newVeh.Spawn(null); } } diff --git a/ReallifeGamemode.Server/Managers/InteractionManager.cs b/ReallifeGamemode.Server/Managers/InteractionManager.cs index 1cc4b1a4..926dd56f 100644 --- a/ReallifeGamemode.Server/Managers/InteractionManager.cs +++ b/ReallifeGamemode.Server/Managers/InteractionManager.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using GTANetworkAPI; using Newtonsoft.Json; @@ -475,26 +475,44 @@ namespace ReallifeGamemode.Server.Managers var backPrice = (int)(vehPrice * 0.4); player.SetData("SellVehicleDecision", true); player.SetData("VehicleToSell", id); - ChatService.SendMessage(player,"~s~Möchtes du das Fahrzeug ~y~" + veh.DisplayName + " ~s~wirklich für ~g~$" + backPrice + " ~s~verkaufen? Drücke ~g~J~s~ zum Bestätigen oder ~r~N ~s~zum Abbrechen"); + ChatService.SendMessage(player, "~s~Möchtes du das Fahrzeug ~y~" + veh.DisplayName + " ~s~wirklich für ~g~$" + backPrice + " ~s~verkaufen? Drücke ~g~J~s~ zum Bestätigen oder ~r~N ~s~zum Abbrechen"); } } - public static void SellPlayerVehicle(Player player, int id) + public static void SellServerVehicle(Player player, int id) { using var dbContext = new DatabaseContext(); var user = player.GetUser(dbContext); - var userVehicle = dbContext.UserVehicles.Where(v => v.Id == id && v.UserId == user.Id).FirstOrDefault(); - var vehPrice = userVehicle.Price; - var backPrice = (int)(vehPrice * 0.4); - GTANetworkAPI.Vehicle veh = VehicleManager.GetVehicleFromServerVehicle(userVehicle); - user.BankAccount.Balance += backPrice; + ServerVehicle serverVehicle = dbContext.ServerVehicles.FirstOrDefault(v => v.Id == id); + + if(serverVehicle is UserVehicle) + { + UserVehicle userVehicle = dbContext.UserVehicles.Where(v => v.Id == id && v.UserId == user.Id).FirstOrDefault(); + var vehPrice = userVehicle.Price; + var backPrice = (int)(vehPrice * 0.4); + GTANetworkAPI.Vehicle veh = VehicleManager.GetVehicleFromServerVehicle(userVehicle); + user.BankAccount.Balance += backPrice; - ChatService.SendMessage(player, $"~b~[INFO]~s~ Du hast durch den Autoverkauf ~g~{backPrice.ToMoneyString()}~s~ erhalten."); + ChatService.SendMessage(player, $"~b~[INFO]~s~ Du hast durch den Autoverkauf ~g~{backPrice.ToMoneyString()}~s~ erhalten."); - dbContext.UserVehicles.Remove(userVehicle); + VehicleManager.DeleteVehicle(veh); + dbContext.UserVehicles.Remove(userVehicle); + player.SendNotification("~g~Du hast dein Fahrzeug verkauft"); + } + else if(serverVehicle is FactionVehicle) + { + FactionVehicle factionVehicle = dbContext.FactionVehicles.FirstOrDefault(v => v.Id == id); + var backPrice = (int)(factionVehicle.BuyPrice * 1.5 * 0.4); + user.Faction.BankAccount.Balance += backPrice; + + ChatService.SendMessage(player, $"~b~[INFO]~s~ Die Fraktionskasse hat ~g~{backPrice.ToMoneyString()}~s~ erhalten."); + + VehicleManager.DeleteVehicle(VehicleManager.GetVehicleFromServerVehicle(factionVehicle)); + + dbContext.FactionVehicles.Remove(factionVehicle); + player.SendNotification("~g~Du hast dein Fraktionsfahrzeug verkauft"); + } dbContext.SaveChanges(); - - veh?.Delete(); } [RemoteEvent("CLIENT:InteractionMenu_FactionVehicleInteraction")] @@ -533,10 +551,10 @@ namespace ReallifeGamemode.Server.Managers return; } - var factionVehicleCount = dbContext.FactionVehicles.ToList().Where(v => v.Id == id && v.GetOwners().Contains(user.FactionId.Value)).Count(); + var factionVehicleCount = dbContext.FactionVehicles.ToList().Where(v => v.GetOwners().Contains(user.FactionId.Value)).Count(); if (factionVehicleCount <= 6) { - ChatService.ErrorMessage(player, "Die Fraktion braucht mindestens 6 Fahrzeuge"); + ChatService.ErrorMessage(player, "Die Fraktion braucht mindestens sechs Fahrzeuge"); return; } @@ -546,16 +564,13 @@ namespace ReallifeGamemode.Server.Managers ChatService.ErrorMessage(player, "Das Fahrzeug konnte nicht verkauft werden. Bitte melde dich bei der Leaderverwaltung"); return; } + + var backPrice = (int)(price.Price * 1.5 * 0.4); - user.Faction.BankAccount.Balance += backPrice; - - ChatService.SendMessage(player, $"~b~[INFO]~s~ Die Fraktionskasse ~g~{backPrice.ToMoneyString()}~s~ erhalten."); - - dbContext.FactionVehicles.Remove(factionVehicle); - dbContext.SaveChanges(); - - veh?.Delete(); + player.SetData("SellVehicleDecision", true); + player.SetData("VehicleToSell", id); + ChatService.SendMessage(player, "~s~Möchtes du das Fahrzeug ~y~" + veh.DisplayName + " ~s~wirklich für ~g~$" + backPrice + " ~s~verkaufen? Drücke ~g~J~s~ zum Bestätigen oder ~r~N ~s~zum Abbrechen"); } } @@ -588,16 +603,16 @@ namespace ReallifeGamemode.Server.Managers { if (amount > 0 && amount <= 10000) { - player.SendNotification($"~w~Du hast ~y~{targetname} ~w~ein Ticket in Höhe von ~b~{amount}$ ~w~gestellt. Grund: ~g~{reason}~w~."); - target.SendNotification($"~b~{player.GetUser().FactionRank.RankName} | {playername} ~w~hat dir ein Ticket in Höhe von ~y~{amount}$ ~w~gestellt.", true); - target.SendNotification($"~w~Grund: ~g~{reason}~w~. ~x~Strafticket im Interaktionsmenü annehmen.", true); + player.SendNotification($"~w~Du hast ~y~{targetname} ~w~ein Ticket in Höhe von ~b~${amount} ~w~ausgestellt. Grund: ~g~{reason}~w~."); + target.SendNotification($"~b~{player.GetUser().FactionRank.RankName} {playername} ~w~hat dir ein Ticket in Höhe von ~y~${amount} ~w~ausgestellt.", true); + target.SendNotification($"~w~Grund: ~g~{reason}~w~. ~x~Das Ticket kann im Interaktionsmenü angenommen werden.", true); target.SetData("ticket_boolean", true); target.SetData("ticket_amount", amount); target.SetData("ticket_player", player); } else { - player.SendNotification("~r~Du kannst nur zwischen 1$ und 10000$ angeben!"); + player.SendNotification("~r~Du kannst nur zwischen $1 und $10.000 angeben!"); } } } @@ -632,7 +647,7 @@ namespace ReallifeGamemode.Server.Managers using var dbContext = new DatabaseContext(); User targetUser = target.GetUser(dbContext); - if(targetUser == null) + if (targetUser == null) { ChatService.PlayerNotFound(player); return; @@ -653,8 +668,8 @@ namespace ReallifeGamemode.Server.Managers targetUser.Points += amount; 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.HQMessage(targetname + " hat von " + playername + " " + amount + " Strafpunkt(e) erhalten. Gesamt: " + targetUser.Points); + target.SendNotification($"~b~{player.GetUser().FactionRank.RankName} {playername} ~w~hat dir ~y~{amount} ~w~Strafpunkte gegeben (Grund: ~r~{reason}~w~).", true); + ChatService.HQMessage(targetname + " hat von " + playername + " " + amount + " Strafpunkt(e) erhalten (Grund: " + reason + "). Gesamt: " + targetUser.Points); if (targetUser.Points < 0) { @@ -662,9 +677,7 @@ namespace ReallifeGamemode.Server.Managers } else if (targetUser.Points >= 12) { - 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 - + target.SendNotification($"~x~Du hast nun ~r~12/12 ~x~Strafpunkte. ~w~Dir wurde dein ~r~Auto- und dein Motorradführerschein ~w~entzogen.", true); ChatService.HQMessage(targetname + " besitzt nun keinen Führerschein mehr."); targetUser.Points = 0; @@ -673,7 +686,7 @@ namespace ReallifeGamemode.Server.Managers } else { - target.SendNotification($"~w~Grund: ~g~{reason}~w~. ~x~Du hast nun ~y~{targetUser.Points}/12 ~x~Strafpunkten.", true); + target.SendNotification($"~x~Du hast nun ~y~{targetUser.Points}/12 ~x~Strafpunkt(e).", true); } dbContext.SaveChanges(); @@ -703,16 +716,22 @@ namespace ReallifeGamemode.Server.Managers player.SendNotification($"~y~{targetname} ~g~hat das Ticket über ~b~{ticket_amount}$ ~g~angenommen und bezahlt.", true); using (var dbContext = new DatabaseContext()) { - target.GetUser(dbContext).BankAccount.Balance -= ticket_amount; - if (player.GetUser().FactionId == 1) + User user = player.GetUser(dbContext); + User targetUser = target.GetUser(dbContext); + targetUser.BankAccount.Balance -= ticket_amount; + + FactionBankAccount lspdBankAccount = dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 1).First().BankAccount; + FactionBankAccount fibBankAccount = dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 3).First().BankAccount; + + if (user.FactionId == 1) { - dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 1).First().BankAccount.Balance += (int)(ticket_amount / 100 * 70); - dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 3).First().BankAccount.Balance += (int)(ticket_amount / 100 * 30); + lspdBankAccount.Balance += (int)(ticket_amount / 100 * 60); + fibBankAccount.Balance += (int)(ticket_amount / 100 * 40); } - if (player.GetUser().FactionId == 1) + else if (user.FactionId == 3) { - dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 3).First().BankAccount.Balance += (int)(ticket_amount / 100 * 70); - dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 1).First().BankAccount.Balance += (int)(ticket_amount / 100 * 30); + fibBankAccount.Balance += (int)(ticket_amount / 100 * 60); + lspdBankAccount.Balance += (int)(ticket_amount / 100 * 40); } dbContext.SaveChanges(); } diff --git a/ReallifeGamemode.Server/Managers/InventoryManager.cs b/ReallifeGamemode.Server/Managers/InventoryManager.cs index d25d977a..d20a69b8 100644 --- a/ReallifeGamemode.Server/Managers/InventoryManager.cs +++ b/ReallifeGamemode.Server/Managers/InventoryManager.cs @@ -34,7 +34,7 @@ namespace ReallifeGamemode.Server.Managers public static Dictionary> backpackItems { get; set; } = new Dictionary>(); public static Dictionary> vehicleItems { get; set; } = new Dictionary>(); - public static Dictionary itemCooldown = new Dictionary(); + public static Dictionary itemCooldown = new Dictionary(); public class InventoryItem { diff --git a/ReallifeGamemode.Server/Managers/JobManager.cs b/ReallifeGamemode.Server/Managers/JobManager.cs index 63abaff8..007228ac 100644 --- a/ReallifeGamemode.Server/Managers/JobManager.cs +++ b/ReallifeGamemode.Server/Managers/JobManager.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -66,7 +66,7 @@ namespace ReallifeGamemode.Server.Managers if (u.JobId == null) { - ChatService.ErrorMessage(player, "Du hast momentan keinen Job, den du kündigen könntest."); + ChatService.ErrorMessage(player, "Du bist bereits arbeitslos"); return; } @@ -89,20 +89,20 @@ namespace ReallifeGamemode.Server.Managers if (u.JobId != null) { - ChatService.ErrorMessage(player, "Du musst deinen alten Job kündigen, bevor du einen neuen ausüben kannst."); + ChatService.ErrorMessage(player, "Du musst deinen alten Job kündigen, bevor du einen Neuen ausüben kannst"); return; } //Pilotjob if (jobId == 3 && u.FlyingLicensePlane == false) { - ChatService.ErrorMessage(player, "Um diesen Job annehmen zu können, musst du einen Flugschein besitzen."); + ChatService.ErrorMessage(player, "Um diesen Job annehmen zu können, musst du einen Flugschein besitzen"); return; } if (u.DriverLicenseVehicle == false) { - ChatService.ErrorMessage(player, "Um diesen Job annehmen zu können, musst du einen Führerschein besitzen."); + ChatService.ErrorMessage(player, "Um diesen Job annehmen zu können, musst du einen Führerschein besitzen"); return; } @@ -202,13 +202,22 @@ namespace ReallifeGamemode.Server.Managers { JobBase job = GetJob(player.GetUser().JobId ?? -1); - if (job != null && job.GetUsersInJob().Contains(player) && job.CheckVehicle(player, veh) && seat == 0) + if (job != null && job.GetUsersInJob().Contains(player)) { - if (!playerTimersJobVehicleRespawn.ContainsKey(player)) - return; + if(job.CheckVehicle(player, veh) && seat == 0) + { + if (!playerTimersJobVehicleRespawn.ContainsKey(player)) + return; - playerTimersJobVehicleRespawn[player].Stop(); - playerTimersJobVehicleRespawn.Remove(player); + playerTimersJobVehicleRespawn[player].Stop(); + playerTimersJobVehicleRespawn.Remove(player); + } + else + { + player.StopAnimation(); + player.WarpOutOfVehicle(); + player.Position = player.Position.Add(new Vector3(0, 0, 2.0f)); + } } } diff --git a/ReallifeGamemode.Server/Managers/LoadManager.cs b/ReallifeGamemode.Server/Managers/LoadManager.cs index a7ab3190..d898e5e4 100644 --- a/ReallifeGamemode.Server/Managers/LoadManager.cs +++ b/ReallifeGamemode.Server/Managers/LoadManager.cs @@ -29,10 +29,12 @@ namespace ReallifeGamemode.Server.Managers foreach (ServerVehicle veh in dbContext.ServerVehicles) { - if (!veh.Active) continue; + if (!veh.Active) + { + continue; + } - Vehicle current = veh.Spawn(); - TuningManager.ApplyTuningToServerVehicle(veh); + veh.Spawn(null); } } } diff --git a/ReallifeGamemode.Server/Managers/PositionManager.cs b/ReallifeGamemode.Server/Managers/PositionManager.cs index 7a3c8c05..c23a06b3 100644 --- a/ReallifeGamemode.Server/Managers/PositionManager.cs +++ b/ReallifeGamemode.Server/Managers/PositionManager.cs @@ -32,6 +32,9 @@ namespace ReallifeGamemode.Server.Managers public static List AmmunationPoints = new List(); + public static Vector3 eventportPosition; + public static bool eventportActive = false; + public static void LoadPositionManager() { #region DutyPoints diff --git a/ReallifeGamemode.Server/Managers/VehicleManager.cs b/ReallifeGamemode.Server/Managers/VehicleManager.cs index e4f05cae..2ccc52a5 100644 --- a/ReallifeGamemode.Server/Managers/VehicleManager.cs +++ b/ReallifeGamemode.Server/Managers/VehicleManager.cs @@ -1,8 +1,10 @@ using GTANetworkAPI; +using Microsoft.Extensions.Logging; using Newtonsoft.Json; using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Extensions; +using ReallifeGamemode.Server.Log; using ReallifeGamemode.Server.Util; using System; using System.Collections.Generic; @@ -772,11 +774,13 @@ namespace ReallifeGamemode.Server.Managers }; - private static readonly Dictionary _serverVehicles = new Dictionary(); + private static readonly Dictionary _serverVehicles = new Dictionary(); private static readonly Dictionary lastPositions = new Dictionary(); private static DateTime lastSave = DateTime.UtcNow; + private static ILogger logger = LogManager.GetLogger(); + public static void CheckEnabledMods() { foreach (var name in _enabledMods) @@ -851,15 +855,23 @@ namespace ReallifeGamemode.Server.Managers { if (_serverVehicles.ContainsKey(serverVehicle.Id)) { - return; + var spawnedHandle = _serverVehicles.Where(s => s.Key == serverVehicle.Id).First().Value; + logger.LogCritical("Server Vehicle {Id} already has a spawned vehicle with handle {spawnedHandle}", serverVehicle.Id, spawnedHandle); + new NetHandle(_serverVehicles[serverVehicle.Id], EntityType.Vehicle).Entity().Delete(); } - if (_serverVehicles.ContainsValue(vehicle.Handle)) + if (_serverVehicles.ContainsValue(vehicle.Handle.Value)) { + var dbId = _serverVehicles.Where(v => v.Value == vehicle.Handle.Value).First().Key; + var dbIdHandle = vehicle.Handle.Value; + logger.LogCritical("Vehicle handle {handle} already belongs to server vehicle {dbIdHandle}", dbIdHandle, dbId); return; } - _serverVehicles[serverVehicle.Id] = vehicle.Handle; + var id = serverVehicle.Id; + var handle = vehicle.Handle.Value; + logger.LogInformation("Mapping server vehicle id {id} to vehicle {handle}", id, handle); + _serverVehicles[serverVehicle.Id] = vehicle.Handle.Value; } internal static void DeleteVehicle(Vehicle veh) @@ -867,15 +879,18 @@ namespace ReallifeGamemode.Server.Managers ServerVehicle sVeh; if ((sVeh = GetServerVehicleFromVehicle(veh)) != null) { + var id = sVeh.Id; + var handle = veh.Handle.Value; + logger.LogInformation("Deleting server vehicle {id} mapping to spawned veh {handle}", id, handle); _serverVehicles.Remove(sVeh.Id); } - veh.Delete(); + veh?.Delete(); } - public static Vehicle GetVehicleFromHandle(NetHandle handle) + public static Vehicle GetVehicleFromHandle(ushort handle) { - return NAPI.Pools.GetAllVehicles().Find(v => v.Handle == handle); + return NAPI.Pools.GetAllVehicles().Find(v => v.Handle.Value == handle); } public static Vehicle GetVehicleFromId(int id) @@ -911,9 +926,9 @@ namespace ReallifeGamemode.Server.Managers dbContext = dbContext ?? new DatabaseContext(); - foreach (KeyValuePair pair in _serverVehicles) + foreach (KeyValuePair pair in _serverVehicles) { - if (pair.Value == veh.Handle) + if (pair.Value == veh.Handle.Value) { return dbContext.ServerVehicles.Find(pair.Key); } @@ -941,20 +956,15 @@ namespace ReallifeGamemode.Server.Managers public static void VehicleManagerVehicleDeath(Vehicle vehicle) { ServerVehicle serverVehicle = GetServerVehicleFromVehicle(vehicle); - NAPI.Util.ConsoleOutput("VehicleDeat: Debug 1"); if (serverVehicle == null) { - NAPI.Util.ConsoleOutput("VehicleDeath: Debug 2"); vehicle.Delete(); return; } InventoryManager.RemoveAllItemsfromVehicleInventory(vehicle); - - NAPI.Util.ConsoleOutput("VehicleDeath: Debug 3"); - Vehicle newVeh = serverVehicle.Spawn(vehicle); - newVeh.Repair(); - newVeh.Rotation = new Vector3(0, 0, serverVehicle.Heading); + + serverVehicle.Spawn(vehicle); } [RemoteEvent("CLIENT:setMarkerBehindVehicle")] diff --git a/ReallifeGamemode.Server/ReallifeGamemode.Server.csproj b/ReallifeGamemode.Server/ReallifeGamemode.Server.csproj index ff6191e1..80049bd1 100644 --- a/ReallifeGamemode.Server/ReallifeGamemode.Server.csproj +++ b/ReallifeGamemode.Server/ReallifeGamemode.Server.csproj @@ -51,7 +51,7 @@ ..\Import\Newtonsoft.Json.dll - + \ No newline at end of file diff --git a/ReallifeGamemode.Server/Report/Report.cs b/ReallifeGamemode.Server/Report/Report.cs index 344da53a..d07ed8c7 100644 --- a/ReallifeGamemode.Server/Report/Report.cs +++ b/ReallifeGamemode.Server/Report/Report.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using GTANetworkAPI; using Newtonsoft.Json; @@ -35,7 +35,7 @@ namespace ReallifeGamemode.Server.Report if (listReports.FindAll(e => (e.isAssigned() == false)).Count == 0) { - ChatService.ErrorMessage(client, "Im Moment gibt es keine Tickets."); + ChatService.ErrorMessage(client, "Aktuell gibt es keine Tickets"); return; } @@ -92,7 +92,8 @@ namespace ReallifeGamemode.Server.Report } } - ChatService.SendMessage(player, "!{#008fff}[REPORT]!{#FFFFFF} Admin " + admin.Name + " hat dein Ticket angenommen! (Benutze /rc zum Schreiben)"); + ChatService.SendMessage(player, "!{#008fff}[REPORT]!{#FFFFFF} Admin " + admin.Name + " hat dein Ticket angenommen! Über /rc [Text] kannst du mit dem Admin schreiben."); + ChatService.SendMessage(admin, "!{#008fff}[REPORT]!{#FFFFFF} Du hast das Ticket von " + player.Name + " angenommen! Über /rc [Text] kannst du mit dem User schreiben."); ChatService.BroadcastDutyAdmin("!{#008fff}[REPORT]!{#FFFFFF} " + admin.Name + " hat das Ticket von " + player.Name + " angenommen"); } diff --git a/ReallifeGamemode.Server/Util/PlayerTimer.cs b/ReallifeGamemode.Server/Util/PlayerTimer.cs index 3059cfee..f93a1227 100644 --- a/ReallifeGamemode.Server/Util/PlayerTimer.cs +++ b/ReallifeGamemode.Server/Util/PlayerTimer.cs @@ -11,9 +11,7 @@ namespace ReallifeGamemode.Server.Util { private readonly Player player; private readonly Vehicle veh; - private readonly IUsableItem usableItem; private readonly Timer timer; - public readonly DateTime startTime; public delegate void PlayerTimerElapsed(Player player, dynamic dynamic); @@ -29,23 +27,10 @@ namespace ReallifeGamemode.Server.Util this.timer.Start(); } - public PlayerTimer(Player player, IUsableItem usableItem, float milliseconds = 1000) - { - this.player = player; - this.usableItem = usableItem; - this.startTime = DateTime.Now.AddMilliseconds(milliseconds); - - this.timer = new Timer(milliseconds); - this.timer.Elapsed += Timer_Elapsed; - this.timer.Start(); - } - private void Timer_Elapsed(object sender, ElapsedEventArgs e) { if (veh != null) Elapsed?.Invoke(player, veh); - else - Elapsed?.Invoke(player, usableItem); } public void Stop() diff --git a/ReallifeGamemode.Server/Util/ThreadTimers.cs b/ReallifeGamemode.Server/Util/ThreadTimers.cs index f0b2a057..5d205ae6 100644 --- a/ReallifeGamemode.Server/Util/ThreadTimers.cs +++ b/ReallifeGamemode.Server/Util/ThreadTimers.cs @@ -32,9 +32,6 @@ namespace ReallifeGamemode.Server.Util timer5000.Start(); timer5000.Elapsed += Timer5000_Elapsed; - timer10000.Start(); - timer10000.Elapsed += Timer10000_Elapsed; - timer60000.Start(); timer60000.Elapsed += Timer60000_Elapsed; } @@ -74,14 +71,7 @@ namespace ReallifeGamemode.Server.Util Economy.Timer_Elapsed(); WeaponDealManager.Timer_Elapsed(); Medic.UpdateReviveSperre(); - }); - } - - private static void Timer10000_Elapsed(object sender, ElapsedEventArgs e) - { - NAPI.Task.Run(() => - { - Jail.BrakeOut_Elapsed(); + Medic.RemoveOldHealTask(); }); } diff --git a/ReallifeGamemode.Server/Wanted/Jail.cs b/ReallifeGamemode.Server/Wanted/Jail.cs index bee57db4..0db1d8dc 100644 --- a/ReallifeGamemode.Server/Wanted/Jail.cs +++ b/ReallifeGamemode.Server/Wanted/Jail.cs @@ -19,7 +19,18 @@ namespace ReallifeGamemode.Server.Wanted { private static Dictionary Jailtime { get; set; } = new Dictionary(); //time in seconds - public static void Check_PutBehindBars(User user) + private static Vector3 JailIn_Point = new Vector3(1690.754, 2591.0464, 45.914402); + private static int JailIn_Range = 3; + private static Vector3 JailOut_Point = new Vector3(1848.3097, 2585.9036, 45.67201); + + private static List prisonCells = new List() { + new Vector3(1629.2026, 2569.8057, 45.564846), + new Vector3(1642.7831, 2570.2622, 45.56483), + new Vector3(1651.512, 2570.2249, 45.564907) + }; + + //positionInJail: ENTWEDER "cell" ODER "outside", TODO: enum oder sowas + public static void Check_PutBehindBars(User user, String positionInJail) { user.SetBlipAndNametagColor(); Player player = user.Player; @@ -31,15 +42,20 @@ namespace ReallifeGamemode.Server.Wanted player.ClearAnimation(); player.SafeSetHealth(100); player.Armor = 0; - Random rnd = new Random(); - int rndInt = rnd.Next(1, 3); - Vector3 position = new Vector3(); - if (rndInt == 1) - position = new Vector3(458.9842, -997.2126, 24.91485); //send client to jail - if (rndInt == 2) - position = new Vector3(459.696, -994.3766, 24.91486); //send client to jail - if (rndInt == 3) - position = new Vector3(458.3372, -1001.258, 24.91485); //send client to jail + + Vector3 position = null; + + if (positionInJail == "cell") + { + Random rnd = new Random(); + int rndInt = rnd.Next(1, 3); + position = prisonCells[rndInt]; + + } + else if (positionInJail == "outside") + { + position = new Vector3(1691.42, 2562.77, 45.56); + } player.SafeTeleport(position, 0, true); @@ -78,7 +94,7 @@ namespace ReallifeGamemode.Server.Wanted using var dbContext = new DatabaseContext(); foreach (var player in NAPI.Pools.GetAllPlayers()) { - if (player.Position.DistanceTo(new Vector3(458.9842, -997.2126, 24.91485)) > 7) + if (player.Position.DistanceTo(JailIn_Point) > JailIn_Range) { continue; } @@ -94,11 +110,12 @@ namespace ReallifeGamemode.Server.Wanted { if (player.Position.DistanceTo(copPlayer.Position) < 5) { - user.SetJailTime(false); + user.SetJailTime(false, dbContext); user.SetBlipAndNametagColor(); user.AnnouncePlayerJailedIn(); dbContext.SaveChanges(); - Check_PutBehindBars(user); + //HERE: Freilauf + Check_PutBehindBars(user, "outside"); break; } } @@ -107,27 +124,6 @@ namespace ReallifeGamemode.Server.Wanted } } - public static void BrakeOut_Elapsed() - { - foreach (var player in NAPI.Pools.GetAllPlayers()) - { - User user = player.GetUser(); - - if (user != null && player.Position.DistanceTo2D(new Vector3(458.9842, -997.2126, 24.91485)) > 7 && Jailtime.ContainsKey(user.Id)) - { - using (var dbContext = new DatabaseContext()) - { - user = player.GetUser(dbContext); - user.JailTime = 0; - user.GiveWanteds(null, 50, "Knast-Ausbruch"); - player.TriggerEvent("jailTime", 0); - dbContext.SaveChanges(); - Jailtime.Remove(user.Id); - } - } - } - } - public static void JailOut_Elapsed() { using var dbContext = new DatabaseContext(); @@ -139,7 +135,7 @@ namespace ReallifeGamemode.Server.Wanted if (user.JailTime <= 0) { Jailtime.Remove(user.Id); - player.SafeTeleport(new Vector3(427.879, -984.65, 30.71)); + player.SafeTeleport(JailOut_Point); player.TriggerEvent("jailTime", 0); return; } @@ -211,5 +207,39 @@ namespace ReallifeGamemode.Server.Wanted target.TriggerEvent("jailTime", 0); } } + + public static void BreakOut(Player player) + { + User user = player.GetUser(); + + using (var dbContext = new DatabaseContext()) + { + user = player.GetUser(dbContext); + user.JailTime = 0; + user.GiveWanteds(null, 50, "Knast-Ausbruch"); + player.TriggerEvent("jailTime", 0); + dbContext.SaveChanges(); + Jailtime.Remove(user.Id); + } + } + + [RemoteEvent("SERVER:BreakOutIfInPrison")] + public void breakOutIfInPrison(Player player) + { + User user = player.GetUser(); + + using (var dbContext = new DatabaseContext()) + { + if (Jailtime.ContainsKey(user.Id)) + { + user = player.GetUser(dbContext); + user.JailTime = 0; + user.GiveWanteds(null, 50, "Knast-Ausbruch"); + player.TriggerEvent("jailTime", 0); + dbContext.SaveChanges(); + Jailtime.Remove(user.Id); + } + } + } } } diff --git a/postbuild.ps1 b/postbuild.ps1 index 4d1396ef..96ee0dc8 100644 --- a/postbuild.ps1 +++ b/postbuild.ps1 @@ -1,4 +1,4 @@ -# +# # @author Codename # @copyright (c) 2008 - 2019 Life of German # @warning Start this script only once, after building server dll @@ -54,25 +54,6 @@ if (![System.IO.File]::Exists($configPath)) { - - false - 127.0.0.1 - 21 - USERNAME - PASSWORD - . - - - false - false - - - false - false - false - - - " # create default content @@ -180,4 +161,4 @@ if ($xmlConfig.config.remote.enabled -eq "true") { # TODO: connect to remote ftp server and update files } -exit 0 \ No newline at end of file +exit 0