From f0186ca155136639f62034d1398513ccbeac0409 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 5 Apr 2021 20:42:20 +0200 Subject: [PATCH 001/116] fix wantedlist --- .../Managers/InteractionManager.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ReallifeGamemode.Server/Managers/InteractionManager.cs b/ReallifeGamemode.Server/Managers/InteractionManager.cs index 5d6875fc..5557ee5e 100644 --- a/ReallifeGamemode.Server/Managers/InteractionManager.cs +++ b/ReallifeGamemode.Server/Managers/InteractionManager.cs @@ -772,13 +772,13 @@ namespace ReallifeGamemode.Server.Managers if (!player.IsLoggedIn()) return; List players = NAPI.Pools.GetAllPlayers(); - var listPlayers = players.Where(p => p.GetUser().Wanteds > 0) - .Select(p => new - { - Id = p.Handle.Value, - p.Name, - wanted = p.GetUser().Wanteds, - }); + var listPlayers = players + .Select(p => new + { + Id = p.Handle.Value, + p.Name, + wanted = p.GetUser()?.Wanteds, + }).Where(u => u.wanted > 0).ToList(); if (listPlayers.Count() > 0) player.TriggerEvent("showWantedlist", JsonConvert.SerializeObject(listPlayers)); From 91b09af0dc6fe8cbb483380bea02779658fd4b7f Mon Sep 17 00:00:00 2001 From: VegaZ Date: Mon, 5 Apr 2021 21:10:16 +0200 Subject: [PATCH 002/116] Fix MedicTaskUpdate --- .../Interaction/factioninteraction.ts | 4 ++-- .../Factions/Medic/Medic.cs | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ReallifeGamemode.Client/Interaction/factioninteraction.ts b/ReallifeGamemode.Client/Interaction/factioninteraction.ts index 392030df..facb710b 100644 --- a/ReallifeGamemode.Client/Interaction/factioninteraction.ts +++ b/ReallifeGamemode.Client/Interaction/factioninteraction.ts @@ -313,7 +313,7 @@ export default function factionInteraction(globalData: IGlobalData) { } else { if (tasks[index].MedicName === "none") { mp.game.graphics.requestStreamedTextureDict("medicimages", true); - mp.events.callRemote("updateMedicTask", 0, index); + mp.events.callRemote("updateMedicTask", 0, tasks[index].Victim); mp.game.ui.setNewWaypoint(tasks[index].Position.x, tasks[index].Position.y); activeCheckpoint = mp.checkpoints.new(1, new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 2), 3.0, { @@ -367,7 +367,7 @@ export default function factionInteraction(globalData: IGlobalData) { } else { if (tasks[index].MedicName === "none") { mp.game.graphics.requestStreamedTextureDict("medicimages", true); - mp.events.callRemote("updateMedicTask", 1, index); + mp.events.callRemote("updateMedicTask", 1, tasks[index].Victim); mp.game.ui.setNewWaypoint(tasks[index].Position.x, tasks[index].Position.y); activeCheckpoint = mp.checkpoints.new(1, new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 2), 3.0, { diff --git a/ReallifeGamemode.Server/Factions/Medic/Medic.cs b/ReallifeGamemode.Server/Factions/Medic/Medic.cs index f4050385..1f12a5a3 100644 --- a/ReallifeGamemode.Server/Factions/Medic/Medic.cs +++ b/ReallifeGamemode.Server/Factions/Medic/Medic.cs @@ -192,27 +192,27 @@ namespace ReallifeGamemode.Server.Factions.Medic } [RemoteEvent("updateMedicTask")] - public void UpdateMedicTasks(Player player, int type, int index) + public void UpdateMedicTasks(Player player, int type, string victim) { - Player target = PlayerService.GetPlayerByNameOrId(ReviveTasks[index].Victim); + Player target = PlayerService.GetPlayerByNameOrId(victim); switch (type) { case 0: - - ReviveTasks[index].MedicName = player.Name; - ChatService.BroadcastFaction("~y~[MEDIC] ~w~" + player.Name + " hat den Reviveauftrag von " + ReviveTasks[index].Victim + " angenommen.", new List() { 2 }); + var reviveTask = ReviveTasks.FirstOrDefault(t => t.Victim == victim); + reviveTask.MedicName = player.Name; + ChatService.BroadcastFaction("~y~[MEDIC] ~w~" + player.Name + " hat den Reviveauftrag von " + victim + " angenommen.", new List() { 2 }); target.SendNotification("~w~Sanitäter~g~ " + player.Name + "~w~ eilt zur Rettung."); - break; case 1: - HealTasks[index].MedicName = player.Name; - ChatService.BroadcastFaction("~y~[MEDIC] ~w~" + player.Name + " hat den Healauftrag von " + ReviveTasks[index].Victim + " angenommen.", new List() { 2 }); + var healTask = ReviveTasks.FirstOrDefault(t => t.Victim == victim); + healTask.MedicName = player.Name; + ChatService.BroadcastFaction("~y~[MEDIC] ~w~" + player.Name + " hat den Healauftrag von " + victim + " angenommen.", new List() { 2 }); target.SendNotification("~w~Sanitäter~g~ " + player.Name + "~w~ hat deinen Auftrag angenommen."); break; case 2: - FireTasks[index].MedicName = player.Name; + //FireTasks[index].MedicName = player.Name; break; } } From 8f225699c6ca7cc3554fdf202b68b5da947c7d3f Mon Sep 17 00:00:00 2001 From: kookroach Date: Mon, 5 Apr 2021 23:40:11 +0200 Subject: [PATCH 003/116] Add AnimationSync --- ReallifeGamemode.Client/index.ts | 13 +- ReallifeGamemode.Client/util/animationSync.ts | 85 ++++++++++++ .../Commands/AdminCommands.cs | 126 ++++++++++-------- ReallifeGamemode.Server/Util/AnimationSync.cs | 34 +++++ 4 files changed, 196 insertions(+), 62 deletions(-) create mode 100644 ReallifeGamemode.Client/util/animationSync.ts create mode 100644 ReallifeGamemode.Server/Util/AnimationSync.cs diff --git a/ReallifeGamemode.Client/index.ts b/ReallifeGamemode.Client/index.ts index 70a08959..6dd166b9 100644 --- a/ReallifeGamemode.Client/index.ts +++ b/ReallifeGamemode.Client/index.ts @@ -7,14 +7,13 @@ import { IGame } from './game'; import RageGame from './core/rage-mp/game'; - var inMenu: boolean = false; let globalData: IGlobalData = { InTuning: false, HideGui: false, InChat: false, - LoggedIn: false, + LoggedIn: false, get InMenu(): boolean { return inMenu; @@ -224,7 +223,6 @@ refuseCollector(); import PedCreator from './Ped/PedCreator'; PedCreator(); - import attachmentManager from './util/attachmentMngr'; attachmentManager(game); @@ -235,14 +233,12 @@ import bankMenuHandle from './Interaction/bankmenu'; import InputHelper from './inputhelper'; bankMenuHandle(globalData); - import ahelp from './Gui/ahelp'; ahelp(globalData); import Introduction from './Gui/introduction'; Introduction(globalData); - import userhelp from './Gui/userhelp'; userhelp(globalData); @@ -252,6 +248,9 @@ drivingschool(globalData); import gangwarHandle from './util/Gangwar'; gangwarHandle(globalData); +import animationSync from './util/animationSync'; +animationSync(); + require('./Gui/policedepartment'); require('./Gui/helptext'); @@ -262,6 +261,4 @@ interface VehicleData { export { VehicleData -} - - +} \ No newline at end of file diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts new file mode 100644 index 00000000..3f76cb63 --- /dev/null +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -0,0 +1,85 @@ +export default function animationSync() { + mp.events.add("SERVER:LoadAnimations", () => { + animationSync.register("Cuffed", "mp_arresting", "idle", true, true, 0); + animationSync.register("ArrestCop", "mp_arrest_paired", "cop_p2_back_right", false, false, 0); + animationSync.register("ArrestCrook", "mp_arrest_paired", "crook_p2_back_right", false, false, 0); + }); + + const animationSync = + { + animations: [], + + playAnim: function (entity, _id) { + if (this.animations.hasOwnProperty(_id)) { + let currentAnim = this.animations[_id]; + let { id, name, animDict, animName, playOnStream, loop, flag } = currentAnim; + + loadAnimDict(animDict, function () { + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, -1, parseInt(flag), 1, !1, !1, !1) + }); + entity.animationData = { name: name, playOnStream: playOnStream }; + } + }, + stopAnim: function (entity: PlayerMp) { + if (!entity.animationData) + return; + + var currAnim = this.animations.find(anim => anim.name == entity.animationData.name); + if (currAnim) { + let { id, name, animDict, animName, playOnStream, loop, flag } = currAnim; + + entity.stopAnimTask(animDict, animName, 3); + entity.animationData = null; + } + }, + + register: function (name, animDict, animName, playOnStream, loop, flag) { + let id = mp.game.joaat(name); + + if (!this.animations.hasOwnProperty(id)) { + this.animations[id] = + { + id: id, + name: name, + animDict: animDict, + animName: animName, + playOnStream: playOnStream, + loop: loop, + flag: flag + }; + } else { + mp.game.graphics.notify("Animation Sync Error: ~r~Duplicate Entry"); + } + } + }; + + mp.events.add("entityStreamIn", (entity) => { + if (entity.type === "player" && entity.animationData) { + if (!entity.animationData.playOnStream) + return; + animationSync.playAnim(entity, entity.animationData.name); + } + }); + + mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => { + let data = string ? string : ""; + + animationSync.stopAnim(entity); + + let animData = animationSync.animations.find(anim => anim.name == data); + if (!animData) + return; + + let { id, name, animDict, animName, playOnStream, loop, flag } = animData; + entity.animationData = { name: name, playOnStream: playOnStream }; + animationSync.playAnim(entity, id) + }); + + function loadAnimDict(animDict, callback) { + if (mp.game.streaming.hasAnimDictLoaded(animDict)) return void callback(); + mp.game.streaming.requestAnimDict(animDict); + let c = setInterval(function () { + mp.game.streaming.hasAnimDictLoaded(animDict) && (clearInterval(c), callback()) + }, 100) + } +} \ No newline at end of file diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 551d092d..76e6afc5 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -34,6 +34,17 @@ namespace ReallifeGamemode.Server.Commands { #region Todo + [Command("syncanim", "~m~Benutzung: ~s~/anim [animName]")] + public void CmdSncAnim(Player player, string animName) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + player.PlaySyncAnimation(animName); + } + [Command("anim", "~m~Benutzung: ~s~/anim [animDict] [animName]")] public void CmdAnim(Player player, string animDict, string animName) { @@ -43,11 +54,8 @@ namespace ReallifeGamemode.Server.Commands return; } NAPI.Player.PlayPlayerAnimation(player, (int)(AnimationFlags.Loop | AnimationFlags.AllowPlayerControl | AnimationFlags.Cancellable), animDict, animName); - } - - [Command("eat", "~m~Benutzung: ~s~/eat [Item]")] public void CmdAdminEat(Player player, string item) { @@ -144,36 +152,38 @@ namespace ReallifeGamemode.Server.Commands #region ahelp - /* [Command("ahelp", "~m~Benutzung: ~s~/ahelp")] - public void CmdAdminHelp(Player player) - { - if (!player.GetUser()?.IsAdmin(AdminLevel.MAPPING) ?? true) - { - ChatService.NotAuthorized(player); - return; - } - else - { - switch (player.GetUser().AdminLevel) - { - case AdminLevel.MAPPING: - ChatService.SendMessage(player, "~b~ " + "/team, /tc, /position"); - break; + /* [Command("ahelp", "~m~Benutzung: ~s~/ahelp")] + public void CmdAdminHelp(Player player) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.MAPPING) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + else + { + switch (player.GetUser().AdminLevel) + { + case AdminLevel.MAPPING: + ChatService.SendMessage(player, "~b~ " + "/team, /tc, /position"); + break; + + case AdminLevel.SUPPORTER: + player.TriggerEvent("showShelp"); + break; + + case AdminLevel.ADMIN: + player.TriggerEvent("showAhelp"); + break; + } + } + } + */ - case AdminLevel.SUPPORTER: - player.TriggerEvent("showShelp"); - break; - - case AdminLevel.ADMIN: - player.TriggerEvent("showAhelp"); - break; - } - } - } - */ #endregion ahelp #region Mapping / Entwicklung + [Command("team", "~m~Benutzung: ~s~/team")] public void CmdAdminTeam(Player player) { @@ -234,7 +244,7 @@ namespace ReallifeGamemode.Server.Commands switch (typ.ToLower()) { case "ip": - if(player.HasData("togip")) + if (player.HasData("togip")) { player.ResetData("togip"); player.SendNotification("~g~[Info]~w~ Ip´s werden nun ausgeblendet."); @@ -258,6 +268,7 @@ namespace ReallifeGamemode.Server.Commands player.SendNotification("~g~[Info]~w~ Deathlogs werden nun angezeigt."); } break; + case "lc": if (player.HasData("toglc")) { @@ -299,6 +310,7 @@ namespace ReallifeGamemode.Server.Commands } user.SetBlipAndNametagColor(); } + [Command("aduty", "~m~Benutzung: ~s~/aduty")] public void CmdAdminAduty(Player player) { @@ -314,11 +326,10 @@ namespace ReallifeGamemode.Server.Commands ChatService.Broadcast("~g~[SUPPORT] " + player.Name + " hat sich zum Support angemeldet"); player.TriggerEvent("toggleADutyMode", true); - } else { - if(player.GetData("SAdminduty")) + if (player.GetData("SAdminduty")) { CmdAdminTSupport(player); } @@ -338,7 +349,7 @@ namespace ReallifeGamemode.Server.Commands ChatService.NotAuthorized(player); return; } - + message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); message = Regex.Replace(message, "#([0-9A-Fa-f]{6})", m => "!{" + m.Groups[0].Value + "}"); @@ -467,8 +478,6 @@ namespace ReallifeGamemode.Server.Commands target.Kick(); ChatService.BroadcastAdmin("~y~SKICK: ~w~" + targetPlayername + " wurde von " + player.GetUser().AdminLevel.GetName() + " " + adminPlayername + " gekickt: " + reason, AdminLevel.SUPPORTER); - - } [Command("clearchat", "~m~Benutzung: ~s~/clearchat")] @@ -780,12 +789,10 @@ namespace ReallifeGamemode.Server.Commands string adminPlayername = NAPI.Player.GetPlayerName(player); ChatService.SendMessage(target, "~r~KICKINFO: ~w~Du wurdest von " + adminPlayername + " vom Server gekickt: " + reason); - + target.Kick(); ChatService.Broadcast("~y~INFO: ~w~" + targetPlayername + " wurde von " + player.GetUser().AdminLevel.GetName() + " " + adminPlayername + " gekickt: " + reason); - - } [Command("warn", "~m~Benutzung: ~s~/warn [Player] [Grund]", GreedyArg = true)] @@ -810,8 +817,8 @@ namespace ReallifeGamemode.Server.Commands using (var dbContext = new DatabaseContext()) { User userwarn = player.GetUser(dbContext); - - userwarn.warn ++; + + userwarn.warn++; dbContext.SaveChanges(); if (userwarn.warn >= 3) { @@ -949,6 +956,7 @@ namespace ReallifeGamemode.Server.Commands else player.Position = new Vector3(p.X, p.Y, p.Z); } } + [Command("destroyped", "~m~Benutzung: ~s~/destroyped [PedNr]")] public void CmdAdminAddPPed(Player player, int PedNr) { @@ -960,6 +968,7 @@ namespace ReallifeGamemode.Server.Commands player.TriggerEvent("CLIENT:DestroyPed", PedNr); //NAPI.Ped.CreatePed(PedHash.Bankman, new Vector3(player.Position.X, player.Position.Y, player.Position.Z), player.Heading, dimension); } + [Command("addpped", "~m~Benutzung: ~s~/addpped [PedNr] [model] [dimension] [Dynamic] [Freezed] [Collision(0-3)] [Weapon] [AttackProof] [Fire/Explosion-Proof] [DrownProof]")] public void CmdAdminAddPPed(Player player, Array PedNr, string model, uint dimension = 0, bool dynamic = false, bool freeze = false, int collision = 0, string weapon = "none", bool attackproof = false, bool fireexplosionproof = false, bool drownproof = false) { @@ -971,6 +980,7 @@ namespace ReallifeGamemode.Server.Commands player.TriggerEvent("CLIENT:AddPed", PedNr, model, player.Position.X, player.Position.Y, player.Position.Z, player.Heading, dimension, dynamic, freeze, collision, weapon, attackproof, fireexplosionproof, drownproof); //NAPI.Ped.CreatePed(PedHash.Bankman, new Vector3(player.Position.X, player.Position.Y, player.Position.Z), player.Heading, dimension); } + [Command("addmped", "~m~Benutzung: ~s~/addmped [model] [dimension]")] public void CmdAdminAddMPed(Player player, int model, uint dimension = 0) { @@ -982,6 +992,7 @@ namespace ReallifeGamemode.Server.Commands player.TriggerEvent("CLIENT:AddPedModel", model, player.Position.X, player.Position.Y, player.Position.Z, player.Heading, dimension); //NAPI.Ped.CreatePed(PedHash.Bankman, new Vector3(player.Position.X, player.Position.Y, player.Position.Z), player.Heading, dimension); } + [Command("addgped", "~m~Benutzung: ~s~/addgped")] public void CmdAdminAddGPed(Player player, int model, uint dimension = 0) { @@ -995,6 +1006,7 @@ namespace ReallifeGamemode.Server.Commands //Peter.freezePosition(true); } + [Command("addgpedmore", "~m~Benutzung: ~s~/addgpedMore")] public void CmdAdminAddGPedMore(Player player, int model, uint dimension = 0) { @@ -1256,7 +1268,7 @@ namespace ReallifeGamemode.Server.Commands foreach (Vehicle v in vehiclesInRange) { ServerVehicle serverVehicle = VehicleManager.GetServerVehicleFromVehicle(v); - if(serverVehicle == null) + if (serverVehicle == null) { VehicleManager.DeleteVehicle(v); v.Trailer?.Delete(); @@ -1462,7 +1474,7 @@ namespace ReallifeGamemode.Server.Commands } ChatService.SendMessage(target, "!{#8181E9}Deine Akte wurde vom Admin " + player.Name + " gelöscht. Grund: " + reason); ChatService.BroadcastFaction("!{#8181E9}HQ: Die Akte von " + target.Name + " wurde vom Admin " + player.Name + " gelöscht. Grund: " + reason + ".", new List() { 1, 3 }); - + target.TriggerEvent("jailTime", 0); targetUser.Wanteds = 0; @@ -1687,6 +1699,7 @@ namespace ReallifeGamemode.Server.Commands #endregion Admin #region ALevel1337 + /*NUR ZUM TESTEN [Command("fakedeath", "~m~Benutzung:~s~ /fakedeath")] public void CmdAdmFakeDeath(Player player) @@ -1718,7 +1731,7 @@ namespace ReallifeGamemode.Server.Commands ChatService.NotAuthorized(player); return; } - player.SetSharedData("blipColor", blipId); + player.SetSharedData("blipColor", blipId); } [Command("setsvar", "~m~Benutzung:~s~ /setsvar [ID] [WERT]")] @@ -1996,7 +2009,7 @@ namespace ReallifeGamemode.Server.Commands { if (!managedPlayer.IsLoggedIn()) return; managedPlayer.GetUser(dbContext).Wage += wage; - + ChatService.SendMessage(managedPlayer, "~b~Admin " + player.Name + " hat im Radius von " + radius + " den Verdienst um $" + wage + " erhöht."); dbContext.SaveChanges(); } @@ -2130,12 +2143,14 @@ namespace ReallifeGamemode.Server.Commands player.SendChatMessage("Modifier steht auf" + modifier); player.TriggerEvent("SERVER:WeaponModifier2", player, modifier, 1); } + [Command("wepmmod", "~m~Benutzung: ~s~/wepmmod [Variable]")] public void CmdWeaponMeeleModifier(Player player, float modifier) { player.SendChatMessage("MeeleModifier steht auf" + modifier); player.TriggerEvent("SERVER:WeaponModifier2", player, 1, modifier); } + [Command("gotocp", "~m~Benutzung: ~s~/gotocp")] public void CmdAdminGotocp(Player admin) { @@ -2379,7 +2394,7 @@ namespace ReallifeGamemode.Server.Commands NAPI.Player.SpawnPlayer(managedPlayer, managedPlayer.Position); managedPlayer.Health = 100; - Medic.delReviveTask(managedPlayer); + Medic.delReviveTask(managedPlayer); } ChatService.SendMessage(player, "~b~Du hast " + playerRevided + " Spieler wiederbelebt."); @@ -2452,10 +2467,10 @@ namespace ReallifeGamemode.Server.Commands { ChatService.PlayerNotFound(player); return; - } + } - using (var dbContext = new DatabaseContext()) - { + using (var dbContext = new DatabaseContext()) + { Faction f = dbContext.Factions.FirstOrDefault(x => x.Id == faction); if (f == null) { @@ -2663,6 +2678,7 @@ namespace ReallifeGamemode.Server.Commands player.SetIntoVehicle(vehicle, 0); } break; + case "noobvehicle": if (player.IsInVehicle) { @@ -3056,6 +3072,7 @@ namespace ReallifeGamemode.Server.Commands player.TriggerEvent("manageFactionRanks", json); } } + [Command("setdoor", "~m~Benutzung: ~s~/setdoor [open/shut] [Tür] [Boolean:Permanet] [Boolean:Lose]")] public void CmdAdminSetDoorOpen(Player player, string status, int door, bool permanent = false, bool lose = true) { @@ -3080,6 +3097,7 @@ namespace ReallifeGamemode.Server.Commands } } } + [Command("aplaysound", "~m~Benutzung: ~s~/aplaysound [Dateiname] [mp3/wav] [volume 0.0 - 100.0]", Alias = "aps")] public void CmdAdminPlaySound(Player player, string sound, string typ, double volume = 100) { @@ -3090,6 +3108,7 @@ namespace ReallifeGamemode.Server.Commands } player.TriggerEvent("CLIENT:PlaySound", sound, typ, volume); } + [Command("astopsound", "~m~Benutzung: ~s~/astopsound", Alias = "ass")] public void CmdAdminStopSound(Player player) { @@ -3100,6 +3119,7 @@ namespace ReallifeGamemode.Server.Commands } player.TriggerEvent("CLIENT:StopSound"); } + [Command("aspeed", "~m~Benutzung: ~s~/aspeed [Modifier1] [Modifier2]")] //TODO: Überarbeiten ?? SetPlayerVelocity ?? public void CmdAdminAspeed(Player player, int modifier, int modifier2 = 1) { @@ -3521,13 +3541,13 @@ namespace ReallifeGamemode.Server.Commands public void CmdAdminCheckStats(Player player, string nameOrId) { User user = player.GetUser(); - if(!user.IsAdmin(AdminLevel.SUPPORTER)) + if (!user.IsAdmin(AdminLevel.SUPPORTER)) { ChatService.NotAuthorized(player); } Player target = PlayerService.GetPlayerByNameOrId(nameOrId); - if(target == null || !target.IsLoggedIn()) + if (target == null || !target.IsLoggedIn()) { ChatService.PlayerNotFound(player); return; @@ -3543,7 +3563,6 @@ namespace ReallifeGamemode.Server.Commands ChatService.SendMessage(player, $"Stats von {target.Name} - HandMoney: {handmoney.ToMoneyString()}, BankMoney: {bankmoney.ToMoneyString()}, DriverLicense: {driverLicense.ToString()}, BikeLicense: {bikeLicense.ToString()}, FlyingLicense: {flyingLicense.ToString()}, WeaponLicense: {weaponLicense.ToString()}"); } - #endregion ALevel1337 #region ALevel1338 @@ -3662,9 +3681,8 @@ namespace ReallifeGamemode.Server.Commands { return; } - if(player.HasData("Adminduty") && player.GetData("Adminduty")) - player.TriggerEvent("ADMIN:NoClip"); + if (player.HasData("Adminduty") && player.GetData("Adminduty")) + player.TriggerEvent("ADMIN:NoClip"); } - } } diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs new file mode 100644 index 00000000..6977da7b --- /dev/null +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using GTANetworkAPI; + +namespace ReallifeGamemode.Server.Util +{ + public static class AnimationSync + { + public static void PlaySyncAnimation(this Player player, string animationName) + { + if (!player.HasData("Animation")) + player.SetData("Animation", String.Empty); + + string currentAnimation = player.GetData("Animation"); + string newAnimation = animationName; + + if (currentAnimation.Equals(newAnimation)) + return; + + player.SetSharedData("AnimationData", newAnimation); + } + + public static void ClearAnimation(this Player player) + { + if (!player.HasData("Animation")) + return; + + player.ResetData("Animation"); + player.ResetSharedData("AnimationData"); + } + } +} From d44afe1dbf3da3fbe3cd89a33ca5e7c3c6432455 Mon Sep 17 00:00:00 2001 From: kookroach Date: Mon, 5 Apr 2021 23:41:46 +0200 Subject: [PATCH 004/116] fix --- ReallifeGamemode.Client/util/animationSync.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 3f76cb63..89376044 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -20,7 +20,7 @@ entity.animationData = { name: name, playOnStream: playOnStream }; } }, - stopAnim: function (entity: PlayerMp) { + stopAnim: function (entity) { if (!entity.animationData) return; @@ -61,7 +61,7 @@ } }); - mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => { + mp.events.addDataHandler("AnimationData", (entity, string) => { let data = string ? string : ""; animationSync.stopAnim(entity); From afab89e31e90c1e6490fd6f9eeb0366d09f23ccc Mon Sep 17 00:00:00 2001 From: kookroach Date: Mon, 5 Apr 2021 23:44:13 +0200 Subject: [PATCH 005/116] Add Load Event --- ReallifeGamemode.Server/Events/Connect.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Server/Events/Connect.cs b/ReallifeGamemode.Server/Events/Connect.cs index d468ddbf..83924b14 100644 --- a/ReallifeGamemode.Server/Events/Connect.cs +++ b/ReallifeGamemode.Server/Events/Connect.cs @@ -23,6 +23,7 @@ namespace ReallifeGamemode.Server.Events [ServerEvent(Event.PlayerConnected)] public void OnPlayerConnected(Player player) { + player.TriggerEvent("SERVER:LoadAnimations"); player.TriggerEvent("CLIENT:StopSound"); //player.SetSharedData("vehicleAdminSpeed2", 1.0); player.SetData("isLoggedIn", false); @@ -81,8 +82,8 @@ namespace ReallifeGamemode.Server.Events player.TriggerEvent("SERVER:Login_ShowBrowser", registered, disableLightMode); string msg = "~m~*** " + player.Name + " [" + player.SocialClubName + "] [ID: " + player.Handle.Value + "] (" + player.Address + ")"; - if(player.HasData("togip")) - { + if (player.HasData("togip")) + { ChatService.SendMessage(player, msg); } } From 9cdc8b6fbb35ae900b1aa6fd7347d389c4bb7f79 Mon Sep 17 00:00:00 2001 From: kookroach Date: Mon, 5 Apr 2021 23:52:41 +0200 Subject: [PATCH 006/116] ok --- ReallifeGamemode.Client/util/animationSync.ts | 6 +++--- ReallifeGamemode.Server/Commands/AdminCommands.cs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 89376044..ca28f247 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -14,6 +14,8 @@ let currentAnim = this.animations[_id]; let { id, name, animDict, animName, playOnStream, loop, flag } = currentAnim; + mp.gui.chat.push("load anim dict"); + mp.game.wait(100); loadAnimDict(animDict, function () { mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, -1, parseInt(flag), 1, !1, !1, !1) }); @@ -62,11 +64,9 @@ }); mp.events.addDataHandler("AnimationData", (entity, string) => { - let data = string ? string : ""; - animationSync.stopAnim(entity); - let animData = animationSync.animations.find(anim => anim.name == data); + let animData = animationSync.animations.find(anim => anim.name == string); if (!animData) return; diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 76e6afc5..ddfff9db 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -34,7 +34,7 @@ namespace ReallifeGamemode.Server.Commands { #region Todo - [Command("syncanim", "~m~Benutzung: ~s~/anim [animName]")] + [Command("syncanim", "~m~Benutzung: ~s~/syncanim [animName]")] public void CmdSncAnim(Player player, string animName) { if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) From 37a49fa3f1a85652be034a86c030ee32f9152235 Mon Sep 17 00:00:00 2001 From: kookroach Date: Mon, 5 Apr 2021 23:57:55 +0200 Subject: [PATCH 007/116] push --- ReallifeGamemode.Client/util/animationSync.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index ca28f247..bfc6b04f 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -23,6 +23,8 @@ } }, stopAnim: function (entity) { + mp.gui.chat.push("in StopAnim"); + mp.game.wait(100); if (!entity.animationData) return; @@ -64,11 +66,17 @@ }); mp.events.addDataHandler("AnimationData", (entity, string) => { + mp.gui.chat.push("inData Handler"); + mp.game.wait(100); animationSync.stopAnim(entity); + mp.gui.chat.push("stopAnim done"); + mp.game.wait(100); let animData = animationSync.animations.find(anim => anim.name == string); if (!animData) return; + mp.gui.chat.push("anim Data found"); + mp.game.wait(100); let { id, name, animDict, animName, playOnStream, loop, flag } = animData; entity.animationData = { name: name, playOnStream: playOnStream }; From 87bec35cb1240c09f9d471487ba0ca4f1b280fd7 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 00:09:18 +0200 Subject: [PATCH 008/116] debug --- ReallifeGamemode.Client/util/animationSync.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index bfc6b04f..c8f5ccfb 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -72,7 +72,14 @@ mp.gui.chat.push("stopAnim done"); mp.game.wait(100); - let animData = animationSync.animations.find(anim => anim.name == string); + mp.gui.chat.push(string); + mp.game.wait(100); + let index = mp.game.joaat(string); + + let animData = animationSync.animations[index]; + mp.gui.chat.push("searching Anim data"); + mp.game.wait(100); + if (!animData) return; mp.gui.chat.push("anim Data found"); From 60b2e689f1d14b104e4246c06879779617846b43 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 00:10:23 +0200 Subject: [PATCH 009/116] debug --- ReallifeGamemode.Client/util/animationSync.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index c8f5ccfb..ecba6190 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -22,13 +22,13 @@ entity.animationData = { name: name, playOnStream: playOnStream }; } }, - stopAnim: function (entity) { + stopAnim: function (entity, index) { mp.gui.chat.push("in StopAnim"); mp.game.wait(100); if (!entity.animationData) return; - var currAnim = this.animations.find(anim => anim.name == entity.animationData.name); + var currAnim = this.animations[index]; if (currAnim) { let { id, name, animDict, animName, playOnStream, loop, flag } = currAnim; @@ -66,15 +66,15 @@ }); mp.events.addDataHandler("AnimationData", (entity, string) => { + let index = mp.game.joaat(string); mp.gui.chat.push("inData Handler"); mp.game.wait(100); - animationSync.stopAnim(entity); + animationSync.stopAnim(entity, index); mp.gui.chat.push("stopAnim done"); mp.game.wait(100); mp.gui.chat.push(string); mp.game.wait(100); - let index = mp.game.joaat(string); let animData = animationSync.animations[index]; mp.gui.chat.push("searching Anim data"); From 0815919ff19c13a0fd0da26ff8e40c44b8176bc0 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 00:24:09 +0200 Subject: [PATCH 010/116] push --- ReallifeGamemode.Client/util/animationSync.ts | 22 ++++--------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index ecba6190..90a4bc2e 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -1,6 +1,6 @@ export default function animationSync() { mp.events.add("SERVER:LoadAnimations", () => { - animationSync.register("Cuffed", "mp_arresting", "idle", true, true, 0); + animationSync.register("Cuffed", "mp_arresting", "idle", true, true, 18); animationSync.register("ArrestCop", "mp_arrest_paired", "cop_p2_back_right", false, false, 0); animationSync.register("ArrestCrook", "mp_arrest_paired", "crook_p2_back_right", false, false, 0); }); @@ -13,18 +13,13 @@ if (this.animations.hasOwnProperty(_id)) { let currentAnim = this.animations[_id]; let { id, name, animDict, animName, playOnStream, loop, flag } = currentAnim; - - mp.gui.chat.push("load anim dict"); - mp.game.wait(100); loadAnimDict(animDict, function () { - mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, -1, parseInt(flag), 1, !1, !1, !1) + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 2, 0, -1, parseInt(flag), 1, !1, !1, !1) }); entity.animationData = { name: name, playOnStream: playOnStream }; } }, stopAnim: function (entity, index) { - mp.gui.chat.push("in StopAnim"); - mp.game.wait(100); if (!entity.animationData) return; @@ -67,27 +62,18 @@ mp.events.addDataHandler("AnimationData", (entity, string) => { let index = mp.game.joaat(string); - mp.gui.chat.push("inData Handler"); - mp.game.wait(100); animationSync.stopAnim(entity, index); - mp.gui.chat.push("stopAnim done"); - mp.game.wait(100); - mp.gui.chat.push(string); - mp.game.wait(100); - let animData = animationSync.animations[index]; - mp.gui.chat.push("searching Anim data"); - mp.game.wait(100); if (!animData) return; - mp.gui.chat.push("anim Data found"); - mp.game.wait(100); let { id, name, animDict, animName, playOnStream, loop, flag } = animData; entity.animationData = { name: name, playOnStream: playOnStream }; animationSync.playAnim(entity, id) + mp.gui.chat.push("finish."); + mp.game.wait(100); }); function loadAnimDict(animDict, callback) { From 186c8f5a454e03f3442c0879822a4780513424c3 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 00:33:46 +0200 Subject: [PATCH 011/116] test --- ReallifeGamemode.Client/util/animationSync.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 90a4bc2e..c33df0a8 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -1,7 +1,7 @@ export default function animationSync() { mp.events.add("SERVER:LoadAnimations", () => { animationSync.register("Cuffed", "mp_arresting", "idle", true, true, 18); - animationSync.register("ArrestCop", "mp_arrest_paired", "cop_p2_back_right", false, false, 0); + animationSync.register("ArrestCop", "mp_arrest_paired", "cop_p2_back_right", false, false, 18); animationSync.register("ArrestCrook", "mp_arrest_paired", "crook_p2_back_right", false, false, 0); }); @@ -9,12 +9,12 @@ { animations: [], - playAnim: function (entity, _id) { + playAnim: function (entity: PlayerMp, _id) { if (this.animations.hasOwnProperty(_id)) { let currentAnim = this.animations[_id]; let { id, name, animDict, animName, playOnStream, loop, flag } = currentAnim; loadAnimDict(animDict, function () { - mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 2, 0, -1, parseInt(flag), 1, !1, !1, !1) + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, -1, parseInt(flag), 0, !1, !1, !1) }); entity.animationData = { name: name, playOnStream: playOnStream }; } From aadce89a71f5f139cc3b4b78e5f7143313457e41 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 00:36:06 +0200 Subject: [PATCH 012/116] fix --- ReallifeGamemode.Client/util/animationSync.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index c33df0a8..1ce782f0 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -9,7 +9,7 @@ { animations: [], - playAnim: function (entity: PlayerMp, _id) { + playAnim: function (entity, _id) { if (this.animations.hasOwnProperty(_id)) { let currentAnim = this.animations[_id]; let { id, name, animDict, animName, playOnStream, loop, flag } = currentAnim; From ceab952dd515866cca7b838531b4fa79fa2a484f Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 03:03:47 +0200 Subject: [PATCH 013/116] ja --- ReallifeGamemode.Client/util/animationSync.ts | 104 +++++++++++------- .../Commands/AdminCommands.cs | 4 +- ReallifeGamemode.Server/Util/AnimationSync.cs | 2 +- 3 files changed, 65 insertions(+), 45 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 1ce782f0..e83c9557 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -1,38 +1,23 @@ -export default function animationSync() { +import { setInterval } from "timers"; + +export default function animationSync() { mp.events.add("SERVER:LoadAnimations", () => { - animationSync.register("Cuffed", "mp_arresting", "idle", true, true, 18); - animationSync.register("ArrestCop", "mp_arrest_paired", "cop_p2_back_right", false, false, 18); - animationSync.register("ArrestCrook", "mp_arrest_paired", "crook_p2_back_right", false, false, 0); + animationSyncData.register("Cuffed", "mp_arresting", "idle", -1, true, 50); + animationSyncData.register("doArrest", "mp_arrest_paired", "cop_p2_back_right", 3000, false, 0); + animationSyncData.register("getArrest", "mp_arrest_paired", "crook_p2_back_right", 3760, false, 0); + animationSyncData.register("doUncuff", "mp_arresting", "a_uncuff", 5500, false, 0); + animationSyncData.register("getUncuff", "mp_arresting", "b_uncuff", 5500, false, 0); }); - const animationSync = + const pairData = [ + { from: "getArrest", transitionTo: "Cuffed" }, + ]; + + const animationSyncData = { animations: [], - playAnim: function (entity, _id) { - if (this.animations.hasOwnProperty(_id)) { - let currentAnim = this.animations[_id]; - let { id, name, animDict, animName, playOnStream, loop, flag } = currentAnim; - loadAnimDict(animDict, function () { - mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, -1, parseInt(flag), 0, !1, !1, !1) - }); - entity.animationData = { name: name, playOnStream: playOnStream }; - } - }, - stopAnim: function (entity, index) { - if (!entity.animationData) - return; - - var currAnim = this.animations[index]; - if (currAnim) { - let { id, name, animDict, animName, playOnStream, loop, flag } = currAnim; - - entity.stopAnimTask(animDict, animName, 3); - entity.animationData = null; - } - }, - - register: function (name, animDict, animName, playOnStream, loop, flag) { + register: function (name, animDict, animName, duration, loop, flag) { let id = mp.game.joaat(name); if (!this.animations.hasOwnProperty(id)) { @@ -42,7 +27,7 @@ name: name, animDict: animDict, animName: animName, - playOnStream: playOnStream, + duration: duration, loop: loop, flag: flag }; @@ -52,28 +37,63 @@ } }; + /* mp.events.add("entityStreamIn", (entity) => { if (entity.type === "player" && entity.animationData) { if (!entity.animationData.playOnStream) return; - animationSync.playAnim(entity, entity.animationData.name); + animationSync.playAnim(entity, mp.game.joaat(entity.animationData.name)); } }); + */ + + setInterval(() => { + mp.players.forEachInStreamRange( + (player) => { + if (!player.animationData) + return; + + let index = mp.game.joaat(player.animationData.name); + let currentAnim = animationSyncData.animations[index]; + let { id, name, animDict, animName, playOnStream, loop, flag } = currentAnim; + + if (player.animationData.loop && !player.isPlayingAnim(animDict, animName, 3)) { + loadAnimDict(animDict, function () { + mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 8, 1, -1, parseInt(flag), 0, !1, !1, !1) + }); + } + }); + }, 100); mp.events.addDataHandler("AnimationData", (entity, string) => { - let index = mp.game.joaat(string); - animationSync.stopAnim(entity, index); - - let animData = animationSync.animations[index]; - - if (!animData) + if (string == null) { + entity.clearTasksImmediately(); + entity.animationData = null; return; + } - let { id, name, animDict, animName, playOnStream, loop, flag } = animData; - entity.animationData = { name: name, playOnStream: playOnStream }; - animationSync.playAnim(entity, id) - mp.gui.chat.push("finish."); - mp.game.wait(100); + while (true) { + let index = mp.game.joaat(string); + let animData = animationSyncData.animations[index]; + + if (!animData) + break; + + let { id, name, animDict, animName, duration, loop, flag } = animData; + entity.animationData = { name: name, loop: loop }; + + loadAnimDict(animDict, function () { + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, -1, parseInt(flag), 0, !1, !1, !1) + }); + mp.game.wait(duration); + + let pair = pairData.find(pair => pair.from == name); + if (!pair) + break; + + string = pair.transitionTo; + mp.gui.chat.push("transition to " + string); + } }); function loadAnimDict(animDict, callback) { diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index ddfff9db..7ad9244a 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -35,14 +35,14 @@ namespace ReallifeGamemode.Server.Commands #region Todo [Command("syncanim", "~m~Benutzung: ~s~/syncanim [animName]")] - public void CmdSncAnim(Player player, string animName) + public void CmdSncAnim(Player player, string animName = null) { if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) { ChatService.NotAuthorized(player); return; } - player.PlaySyncAnimation(animName); + player.SyncAnimation(animName); } [Command("anim", "~m~Benutzung: ~s~/anim [animDict] [animName]")] diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index 6977da7b..32e04773 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -8,7 +8,7 @@ namespace ReallifeGamemode.Server.Util { public static class AnimationSync { - public static void PlaySyncAnimation(this Player player, string animationName) + public static void SyncAnimation(this Player player, string animationName) { if (!player.HasData("Animation")) player.SetData("Animation", String.Empty); From b4bf6180ef5abb638207a9ce5549353df933db8c Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 03:11:27 +0200 Subject: [PATCH 014/116] typo --- ReallifeGamemode.Client/util/animationSync.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index e83c9557..d2127836 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -55,11 +55,11 @@ export default function animationSync() { let index = mp.game.joaat(player.animationData.name); let currentAnim = animationSyncData.animations[index]; - let { id, name, animDict, animName, playOnStream, loop, flag } = currentAnim; + let { id, name, animDict, animName, duration, loop, flag } = currentAnim; if (player.animationData.loop && !player.isPlayingAnim(animDict, animName, 3)) { loadAnimDict(animDict, function () { - mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 8, 1, -1, parseInt(flag), 0, !1, !1, !1) + mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); } }); From 218cdb1914dee63dcd0315ae1254adfa7b40151d Mon Sep 17 00:00:00 2001 From: Siga Date: Tue, 6 Apr 2021 01:14:04 +0000 Subject: [PATCH 015/116] test --- package-lock.json | 4071 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 4070 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 48e341a0..e523848f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,3 +1,4072 @@ { - "lockfileVersion": 1 + "name": "client", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helpers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", + "dev": true, + "requires": { + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "dev": true + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@types/node": { + "version": "11.13.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.18.tgz", + "integrity": "sha512-sMHdXLccscaxI+Hlzz58yLQue3lQyXP+6aQniDRi5oju3n0123kcjhicVGF20WF7cHiwJ2vxMbXc4skOclosoA==", + "dev": true + }, + "@types/ragemp-c": { + "version": "github:kookroach/types-ragemp-c#849cf51f85066c786ad3c563872ae74d9af2dd7c", + "from": "github:kookroach/types-ragemp-c#v1.0", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", + "dev": true, + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "elliptic": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", + "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "serialize-javascript": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz", + "integrity": "sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.2.tgz", + "integrity": "sha512-jvNoEQSPXJdssFwqPSgWjsOrb+ELoE+ILpHPKXC83tIxOlh2U75F1KuB2luLD/3a6/7K3Vw5pDn+hvu0C4AzSw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "ts-loader": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.4.5.tgz", + "integrity": "sha512-XYsjfnRQCBum9AMRZpk2rTYSVpdZBpZK+kDh0TeT3kxmQNBDVIeUjdPjY5RZry4eIAb8XHc4gYSUiUWPYvzSRw==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^3.1.4", + "semver": "^5.0.1" + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", + "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==", + "dev": true + }, + "uglify-js": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz", + "integrity": "sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ==", + "dev": true, + "requires": { + "commander": "~2.20.3", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz", + "integrity": "sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "uglify-js": "^3.6.0", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true + }, + "watchpack": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", + "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", + "dev": true, + "requires": { + "chokidar": "^2.1.8", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "webpack": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.38.0.tgz", + "integrity": "sha512-lbuFsVOq8PZY+1Ytz/mYOvYOo+d4IJ31hHk/7iyoeWtwN33V+5HYotSH+UIb9tq914ey0Hot7z6HugD+je3sWw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^1.0.0", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + } + }, + "webpack-cli": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.6.tgz", + "integrity": "sha512-0vEa83M7kJtxK/jUhlpZ27WHIOndz5mghWL2O53kiDoA9DIxSKnfqB92LoqEn77cT4f3H2cZm1BMEat/6AZz3A==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } } From e6943e614017ffc8027080a2c638fbb371ad2438 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 03:21:11 +0200 Subject: [PATCH 016/116] pipeline will nicht --- ReallifeGamemode.Client/util/animationSync.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index d2127836..581ff1d3 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -11,6 +11,7 @@ export default function animationSync() { const pairData = [ { from: "getArrest", transitionTo: "Cuffed" }, + ]; const animationSyncData = From 5978bf55c791c0f7c2f8587c59944feba1e28a53 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 03:30:08 +0200 Subject: [PATCH 017/116] Bro wtf --- ReallifeGamemode.Client/util/animationSync.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 581ff1d3..8fb561ed 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -1,6 +1,4 @@ -import { setInterval } from "timers"; - -export default function animationSync() { +export default function animationSync() { mp.events.add("SERVER:LoadAnimations", () => { animationSyncData.register("Cuffed", "mp_arresting", "idle", -1, true, 50); animationSyncData.register("doArrest", "mp_arrest_paired", "cop_p2_back_right", 3000, false, 0); From 78c3a9de3f7aeaa1b081ba3d2e92e881aa3832e7 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 03:35:33 +0200 Subject: [PATCH 018/116] sleep --- ReallifeGamemode.Client/util/animationSync.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 8fb561ed..f95d83c8 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -49,14 +49,14 @@ setInterval(() => { mp.players.forEachInStreamRange( (player) => { - if (!player.animationData) + if (!player.getVariable("AnimationData")) return; - let index = mp.game.joaat(player.animationData.name); + let index = mp.game.joaat(player.getVariable("AnimationData")); let currentAnim = animationSyncData.animations[index]; let { id, name, animDict, animName, duration, loop, flag } = currentAnim; - if (player.animationData.loop && !player.isPlayingAnim(animDict, animName, 3)) { + if (loop && !player.isPlayingAnim(animDict, animName, 3)) { loadAnimDict(animDict, function () { mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); @@ -79,7 +79,6 @@ break; let { id, name, animDict, animName, duration, loop, flag } = animData; - entity.animationData = { name: name, loop: loop }; loadAnimDict(animDict, function () { mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, -1, parseInt(flag), 0, !1, !1, !1) From 286dae85976656672afe49cd6cec7d8ab505f299 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 03:42:58 +0200 Subject: [PATCH 019/116] try --- ReallifeGamemode.Client/util/animationSync.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index f95d83c8..2f9d95f4 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -71,6 +71,10 @@ return; } + playAnim(entity, string); + }); + + async function playAnim(entity, string) { while (true) { let index = mp.game.joaat(string); let animData = animationSyncData.animations[index]; @@ -83,7 +87,10 @@ loadAnimDict(animDict, function () { mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, -1, parseInt(flag), 0, !1, !1, !1) }); - mp.game.wait(duration); + + while (entity.isPlayingAnim(animDict, animName, 3)) { + await mp.game.waitAsync(0); + } let pair = pairData.find(pair => pair.from == name); if (!pair) @@ -92,7 +99,7 @@ string = pair.transitionTo; mp.gui.chat.push("transition to " + string); } - }); + } function loadAnimDict(animDict, callback) { if (mp.game.streaming.hasAnimDictLoaded(animDict)) return void callback(); From 968c0b80523d600e11b4282196349e768ebea623 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 04:03:16 +0200 Subject: [PATCH 020/116] test --- ReallifeGamemode.Client/util/animationSync.ts | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 2f9d95f4..9646f419 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -1,4 +1,6 @@ -export default function animationSync() { +import planeSchoolHandle from "./planeschool"; + +export default function animationSync() { mp.events.add("SERVER:LoadAnimations", () => { animationSyncData.register("Cuffed", "mp_arresting", "idle", -1, true, 50); animationSyncData.register("doArrest", "mp_arrest_paired", "cop_p2_back_right", 3000, false, 0); @@ -64,18 +66,18 @@ }); }, 100); - mp.events.addDataHandler("AnimationData", (entity, string) => { + mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => { if (string == null) { entity.clearTasksImmediately(); entity.animationData = null; return; } + let lastAnim; - playAnim(entity, string); - }); - - async function playAnim(entity, string) { while (true) { + if (lastAnim && entity.isPlayingAnim(lastAnim.dict, lastAnim.name, 3)) + continue; + mp.gui.chat.push("transition to " + string); let index = mp.game.joaat(string); let animData = animationSyncData.animations[index]; @@ -85,21 +87,18 @@ let { id, name, animDict, animName, duration, loop, flag } = animData; loadAnimDict(animDict, function () { - mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, -1, parseInt(flag), 0, !1, !1, !1) + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) }); - while (entity.isPlayingAnim(animDict, animName, 3)) { - await mp.game.waitAsync(0); - } - let pair = pairData.find(pair => pair.from == name); if (!pair) break; string = pair.transitionTo; - mp.gui.chat.push("transition to " + string); + + lastAnim = { dict: animDict, name: animName }; } - } + }); function loadAnimDict(animDict, callback) { if (mp.game.streaming.hasAnimDictLoaded(animDict)) return void callback(); From 5e8fe218f84c1803c6dc825c68329497e5e67139 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 04:05:58 +0200 Subject: [PATCH 021/116] fail --- ReallifeGamemode.Client/util/animationSync.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 9646f419..d4484f7e 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -69,7 +69,6 @@ export default function animationSync() { mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => { if (string == null) { entity.clearTasksImmediately(); - entity.animationData = null; return; } let lastAnim; From b9f579dd1d86155a0c4fc39b5c1cbb43fe7ebe88 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 04:13:18 +0200 Subject: [PATCH 022/116] test --- ReallifeGamemode.Client/util/animationSync.ts | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index d4484f7e..6aca7731 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -71,12 +71,10 @@ export default function animationSync() { entity.clearTasksImmediately(); return; } - let lastAnim; while (true) { - if (lastAnim && entity.isPlayingAnim(lastAnim.dict, lastAnim.name, 3)) - continue; mp.gui.chat.push("transition to " + string); + let index = mp.game.joaat(string); let animData = animationSyncData.animations[index]; @@ -85,17 +83,18 @@ export default function animationSync() { let { id, name, animDict, animName, duration, loop, flag } = animData; - loadAnimDict(animDict, function () { - mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) - }); + if (entity.getAnimCurrentTime(animDict, animName) > 0.95) { + let pair = pairData.find(pair => pair.from == name); + if (!pair) + break; - let pair = pairData.find(pair => pair.from == name); - if (!pair) - break; - - string = pair.transitionTo; - - lastAnim = { dict: animDict, name: animName }; + string = pair.transitionTo; + } + else if (entity.getAnimCurrentTime(animDict, animName) == 0) { + loadAnimDict(animDict, function () { + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) + }); + } } }); From c082d0b47a5c02c4c2c2b3cf5971758fa2ec14d4 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 04:17:00 +0200 Subject: [PATCH 023/116] ok --- ReallifeGamemode.Client/util/animationSync.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 6aca7731..22dfd365 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -72,6 +72,7 @@ export default function animationSync() { return; } + let pair; while (true) { mp.gui.chat.push("transition to " + string); @@ -84,17 +85,16 @@ export default function animationSync() { let { id, name, animDict, animName, duration, loop, flag } = animData; if (entity.getAnimCurrentTime(animDict, animName) > 0.95) { - let pair = pairData.find(pair => pair.from == name); - if (!pair) - break; - string = pair.transitionTo; } else if (entity.getAnimCurrentTime(animDict, animName) == 0) { loadAnimDict(animDict, function () { - mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, -1, parseInt(flag), 0, !1, !1, !1) }); } + pair = pairData.find(pair => pair.from == name); + if (!pair) + break; } }); From 83aefb7fb779b753e7291e483c982fdd2ab4c69b Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 04:29:16 +0200 Subject: [PATCH 024/116] last test --- ReallifeGamemode.Client/util/animationSync.ts | 36 +++++++++---------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 22dfd365..60d2d57a 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -72,30 +72,26 @@ export default function animationSync() { return; } - let pair; - while (true) { - mp.gui.chat.push("transition to " + string); + mp.gui.chat.push("transition to " + string); - let index = mp.game.joaat(string); - let animData = animationSyncData.animations[index]; + let index = mp.game.joaat(string); + let animData = animationSyncData.animations[index]; - if (!animData) - break; + if (!animData) + return; - let { id, name, animDict, animName, duration, loop, flag } = animData; + let { id, name, animDict, animName, duration, loop, flag } = animData; - if (entity.getAnimCurrentTime(animDict, animName) > 0.95) { - string = pair.transitionTo; - } - else if (entity.getAnimCurrentTime(animDict, animName) == 0) { - loadAnimDict(animDict, function () { - mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, -1, parseInt(flag), 0, !1, !1, !1) - }); - } - pair = pairData.find(pair => pair.from == name); - if (!pair) - break; - } + loadAnimDict(animDict, function () { + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, -1, parseInt(flag), 0, !1, !1, !1) + }); + + let pair = pairData.find(pair => pair.from == name); + if (!pair && duration < 0) + return; + string = setInterval(function () { + pair.transitionTo; + }, duration); }); function loadAnimDict(animDict, callback) { From 7ff4691a8edca25eb2ee2bc266b52c2396203b3e Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 04:31:18 +0200 Subject: [PATCH 025/116] ok --- ReallifeGamemode.Client/util/animationSync.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 60d2d57a..ed6bdd5a 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -89,8 +89,10 @@ export default function animationSync() { let pair = pairData.find(pair => pair.from == name); if (!pair && duration < 0) return; - string = setInterval(function () { - pair.transitionTo; + + let c = setInterval(function () { + string = pair.transitionTo; + entity.clearTasksImmediately(); }, duration); }); From 5ea53b6a73318903fed9839a36a1a11368cf06a7 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 04:47:31 +0200 Subject: [PATCH 026/116] . --- ReallifeGamemode.Client/util/animationSync.ts | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index ed6bdd5a..87d43dd5 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -72,28 +72,35 @@ export default function animationSync() { return; } - mp.gui.chat.push("transition to " + string); + let playAnim = true; + let a = setInterval(function () { + let index = mp.game.joaat(string); + let animData = animationSyncData.animations[index]; - let index = mp.game.joaat(string); - let animData = animationSyncData.animations[index]; + if (!animData) + clearInterval(a); - if (!animData) - return; + let { id, name, animDict, animName, duration, loop, flag } = animData; - let { id, name, animDict, animName, duration, loop, flag } = animData; + if (playAnim) { + loadAnimDict(animDict, function () { + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, -1, parseInt(flag), 0, !1, !1, !1) + }); + playAnim = false; + } - loadAnimDict(animDict, function () { - mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, -1, parseInt(flag), 0, !1, !1, !1) - }); + let pair = pairData.find(pair => pair.from == string); + if (!pair) + clearInterval(a); - let pair = pairData.find(pair => pair.from == name); - if (!pair && duration < 0) - return; - - let c = setInterval(function () { - string = pair.transitionTo; - entity.clearTasksImmediately(); - }, duration); + let b = setInterval(function () { + string = pair.transitionTo; + mp.gui.chat.push("transition to " + string); + playAnim = true; + entity.clearTasksImmediately(); + clearInterval(b); + }, duration); + }, 200); }); function loadAnimDict(animDict, callback) { From 332d07630e2b42baebc77b96eb0d36209f0ff305 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 04:52:30 +0200 Subject: [PATCH 027/116] . --- ReallifeGamemode.Client/util/animationSync.ts | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 87d43dd5..f33cfdad 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -77,8 +77,10 @@ export default function animationSync() { let index = mp.game.joaat(string); let animData = animationSyncData.animations[index]; - if (!animData) + if (!animData) { clearInterval(a); + return; + } let { id, name, animDict, animName, duration, loop, flag } = animData; @@ -87,19 +89,21 @@ export default function animationSync() { mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, -1, parseInt(flag), 0, !1, !1, !1) }); playAnim = false; + + let pair = pairData.find(pair => pair.from == string); + if (!pair) { + clearInterval(a); + return; + } + + let b = setInterval(function () { + string = pair.transitionTo; + mp.gui.chat.push("transition to " + string); + playAnim = true; + entity.clearTasksImmediately(); + clearInterval(b); + }, duration); } - - let pair = pairData.find(pair => pair.from == string); - if (!pair) - clearInterval(a); - - let b = setInterval(function () { - string = pair.transitionTo; - mp.gui.chat.push("transition to " + string); - playAnim = true; - entity.clearTasksImmediately(); - clearInterval(b); - }, duration); }, 200); }); From ff15af3789c863bae2ada2fea1ff9f9bb98cba79 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 04:54:56 +0200 Subject: [PATCH 028/116] --- ReallifeGamemode.Client/util/animationSync.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index f33cfdad..b275fa88 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -86,7 +86,7 @@ export default function animationSync() { if (playAnim) { loadAnimDict(animDict, function () { - mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, -1, parseInt(flag), 0, !1, !1, !1) + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) }); playAnim = false; From c6e3c6fecb3a15a006377d287197dbe869e9675b Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 05:12:55 +0200 Subject: [PATCH 029/116] animation Sync Ready --- ReallifeGamemode.Client/util/animationSync.ts | 51 +++++++------------ ReallifeGamemode.Server/Util/AnimationSync.cs | 9 ++++ 2 files changed, 28 insertions(+), 32 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index b275fa88..c99fb048 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -72,39 +72,26 @@ export default function animationSync() { return; } - let playAnim = true; + let index = mp.game.joaat(string); + let animData = animationSyncData.animations[index]; + + if (!animData) return; + + let { id, name, animDict, animName, duration, loop, flag } = animData; + + loadAnimDict(animDict, function () { + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) + }); + + let pair = pairData.find(pair => pair.from == string); + if (!pair) + return; + let a = setInterval(function () { - let index = mp.game.joaat(string); - let animData = animationSyncData.animations[index]; - - if (!animData) { - clearInterval(a); - return; - } - - let { id, name, animDict, animName, duration, loop, flag } = animData; - - if (playAnim) { - loadAnimDict(animDict, function () { - mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) - }); - playAnim = false; - - let pair = pairData.find(pair => pair.from == string); - if (!pair) { - clearInterval(a); - return; - } - - let b = setInterval(function () { - string = pair.transitionTo; - mp.gui.chat.push("transition to " + string); - playAnim = true; - entity.clearTasksImmediately(); - clearInterval(b); - }, duration); - } - }, 200); + entity.clearTasksImmediately(); + mp.events.callRemote("CLIENT:AnimPairTransition", entity, pair.transitionTo); + clearInterval(a); + }, duration); }); function loadAnimDict(animDict, callback) { diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index 32e04773..748591c7 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -31,4 +31,13 @@ namespace ReallifeGamemode.Server.Util player.ResetSharedData("AnimationData"); } } + + public class AnimationSyncEvents + { + [RemoteEvent("CLIENT:AnimPairTransition")] + public void AnimPairTransition(Player player, Player target, string transitionTo) + { + target.SyncAnimation(transitionTo); + } + } } From cc5304f7752dc4d66fbecde6ecd98ea48cd34b62 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 05:30:18 +0200 Subject: [PATCH 030/116] /cuff Command (not tested) --- .../Commands/AdminCommands.cs | 29 +++++++++++++++++++ ReallifeGamemode.Server/Util/AnimationSync.cs | 5 ++++ 2 files changed, 34 insertions(+) diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 7ad9244a..85aba9b5 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -34,6 +34,35 @@ namespace ReallifeGamemode.Server.Commands { #region Todo + [Command("cuff", "~m~Benutzung: ~s~/cuff [ID]")] + public void CmdSncAnim(Player player, string nameOrId) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + Player target = PlayerService.GetPlayerByNameOrId(nameOrId); + if (target.Id == player.Id) + return; + + float rad = player.Heading * MathF.PI / 180; + Vector3 forward = new Vector3(player.Position.X + (1.2 * MathF.Sin(rad)), player.Position.Y + (1.2 * MathF.Cos(rad)), player.Position.Z); + + target.Position = forward; + + if (!target.HasAnimation("Cuffed")) + { + player.SyncAnimation("doArrest"); + target.SyncAnimation("getArrest"); + } + else + { + player.SyncAnimation("doUncuff"); + target.SyncAnimation("getUncuff"); + } + } + [Command("syncanim", "~m~Benutzung: ~s~/syncanim [animName]")] public void CmdSncAnim(Player player, string animName = null) { diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index 748591c7..4f33ea9e 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -22,6 +22,11 @@ namespace ReallifeGamemode.Server.Util player.SetSharedData("AnimationData", newAnimation); } + public static bool HasAnimation(this Player player, string animationName) + { + return player.HasData("Animation") && (player.GetData("AnimationData") == animationName); + } + public static void ClearAnimation(this Player player) { if (!player.HasData("Animation")) From 01e53b8aa70ad5e1cfe33911df6366c2ed5bb05e Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 14:30:30 +0200 Subject: [PATCH 031/116] Test /Cuff [id] --- ReallifeGamemode.Server/Commands/AdminCommands.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 85aba9b5..4f5bc0a9 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -35,7 +35,7 @@ namespace ReallifeGamemode.Server.Commands #region Todo [Command("cuff", "~m~Benutzung: ~s~/cuff [ID]")] - public void CmdSncAnim(Player player, string nameOrId) + public void CmdCuffTest(Player player, string nameOrId) { if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) { @@ -47,9 +47,9 @@ namespace ReallifeGamemode.Server.Commands return; float rad = player.Heading * MathF.PI / 180; - Vector3 forward = new Vector3(player.Position.X + (1.2 * MathF.Sin(rad)), player.Position.Y + (1.2 * MathF.Cos(rad)), player.Position.Z); + Vector3 forwardV3 = new Vector3(player.Position.X + (1.2 * MathF.Sin(rad)), player.Position.Y + (1.2 * MathF.Cos(rad)), player.Position.Z); - target.Position = forward; + target.Position = forwardV3; if (!target.HasAnimation("Cuffed")) { @@ -64,7 +64,7 @@ namespace ReallifeGamemode.Server.Commands } [Command("syncanim", "~m~Benutzung: ~s~/syncanim [animName]")] - public void CmdSncAnim(Player player, string animName = null) + public void CmdSyncAnim(Player player, string animName = null) { if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) { From 4ee8e81a92c8f64fec319ffc200f1b63f1cddc04 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 14:54:44 +0200 Subject: [PATCH 032/116] fix --- ReallifeGamemode.Client/util/animationSync.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index c99fb048..37631a71 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -67,20 +67,22 @@ export default function animationSync() { }, 100); mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => { + entity.clearTasksImmediately(); + if (string == null) { - entity.clearTasksImmediately(); return; } let index = mp.game.joaat(string); - let animData = animationSyncData.animations[index]; - if (!animData) return; + if (!animationSyncData.animations.hasOwnProperty(index)) return; + + let animData = animationSyncData.animations[index]; let { id, name, animDict, animName, duration, loop, flag } = animData; loadAnimDict(animDict, function () { - mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); let pair = pairData.find(pair => pair.from == string); @@ -88,7 +90,6 @@ export default function animationSync() { return; let a = setInterval(function () { - entity.clearTasksImmediately(); mp.events.callRemote("CLIENT:AnimPairTransition", entity, pair.transitionTo); clearInterval(a); }, duration); From d1470564e351d736311df9b58f8f87fd25272b1a Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 14:59:08 +0200 Subject: [PATCH 033/116] fix ServerSide --- ReallifeGamemode.Server/Util/AnimationSync.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index 4f33ea9e..ea4cceda 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -37,7 +37,7 @@ namespace ReallifeGamemode.Server.Util } } - public class AnimationSyncEvents + public class AnimationSyncEvents : Script { [RemoteEvent("CLIENT:AnimPairTransition")] public void AnimPairTransition(Player player, Player target, string transitionTo) From bda2273f8f51aa61c88a1ff5a093db657a242fd2 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 15:30:28 +0200 Subject: [PATCH 034/116] Animation Sync events --- ReallifeGamemode.Server/Events/Connect.cs | 1 - ReallifeGamemode.Server/Util/AnimationSync.cs | 34 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/ReallifeGamemode.Server/Events/Connect.cs b/ReallifeGamemode.Server/Events/Connect.cs index 83924b14..becbb3b9 100644 --- a/ReallifeGamemode.Server/Events/Connect.cs +++ b/ReallifeGamemode.Server/Events/Connect.cs @@ -23,7 +23,6 @@ namespace ReallifeGamemode.Server.Events [ServerEvent(Event.PlayerConnected)] public void OnPlayerConnected(Player player) { - player.TriggerEvent("SERVER:LoadAnimations"); player.TriggerEvent("CLIENT:StopSound"); //player.SetSharedData("vehicleAdminSpeed2", 1.0); player.SetData("isLoggedIn", false); diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index ea4cceda..7ff3d3ad 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -8,7 +8,7 @@ namespace ReallifeGamemode.Server.Util { public static class AnimationSync { - public static void SyncAnimation(this Player player, string animationName) + public static void SyncAnimation(this Player player, dynamic animationName) { if (!player.HasData("Animation")) player.SetData("Animation", String.Empty); @@ -22,7 +22,18 @@ namespace ReallifeGamemode.Server.Util player.SetSharedData("AnimationData", newAnimation); } - public static bool HasAnimation(this Player player, string animationName) + /// Check if Player has any Animation playing. + /// + /// + public static bool HasAnimation(this Player player) + { + return player.HasData("Animation"); + } + + /// Check if Player has a specific Animation playing. + /// + /// Name of requested animation + public static bool HasAnimation(this Player player, dynamic animationName) { return player.HasData("Animation") && (player.GetData("AnimationData") == animationName); } @@ -44,5 +55,24 @@ namespace ReallifeGamemode.Server.Util { target.SyncAnimation(transitionTo); } + + [ServerEvent(Event.PlayerWeaponSwitch)] + public void OnPlayerWeaponSwitch(Player player, WeaponHash oldWeapon, WeaponHash newWeapon) + { + if (!player.HasAnimation()) return; + NAPI.Player.SetPlayerCurrentWeapon(player, WeaponHash.Unarmed); + } + + [ServerEvent(Event.PlayerConnected)] + public void OnPlayerConnected(Player player) + { + player.TriggerEvent("SERVER:LoadAnimations"); + } + + [ServerEvent(Event.PlayerDeath)] + public void OnPlayerDeath(Player player, Player killer, uint reason) + { + player.ClearAnimation(); + } } } From 1030116cba6440e0b84e857dca89f1aff3e2759d Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 15:52:13 +0200 Subject: [PATCH 035/116] disable attack on animation --- ReallifeGamemode.Client/util/animationSync.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 37631a71..1ee7bcb8 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -62,6 +62,8 @@ export default function animationSync() { loadAnimDict(animDict, function () { mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); + if (player == mp.players.local) + mp.game.controls.disableControlAction(32, 24, true); } }); }, 100); @@ -69,6 +71,9 @@ export default function animationSync() { mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => { entity.clearTasksImmediately(); + if (entity == mp.players.local) + mp.game.controls.disableControlAction(32, 24, false); + if (string == null) { return; } @@ -85,6 +90,9 @@ export default function animationSync() { mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); + if (entity == mp.players.local) + mp.game.controls.disableControlAction(32, 24, true); + let pair = pairData.find(pair => pair.from == string); if (!pair) return; From 002f5b4667589768c3046ebe5e061157adff877a Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 15:58:05 +0200 Subject: [PATCH 036/116] try disableControlAction --- ReallifeGamemode.Client/util/animationSync.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 1ee7bcb8..920512c8 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -62,8 +62,12 @@ export default function animationSync() { loadAnimDict(animDict, function () { mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); - if (player == mp.players.local) + if (player == mp.players.local) { //block player from using LMB to attack mp.game.controls.disableControlAction(32, 24, true); + mp.game.controls.disableControlAction(32, 140, true); + mp.game.controls.disableControlAction(32, 141, true); + mp.game.controls.disableControlAction(32, 142, true); + } } }); }, 100); @@ -71,8 +75,12 @@ export default function animationSync() { mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => { entity.clearTasksImmediately(); - if (entity == mp.players.local) + if (entity == mp.players.local) { //allow player using LMB to attack mp.game.controls.disableControlAction(32, 24, false); + mp.game.controls.disableControlAction(32, 140, false); + mp.game.controls.disableControlAction(32, 141, false); + mp.game.controls.disableControlAction(32, 142, false); + } if (string == null) { return; @@ -90,8 +98,12 @@ export default function animationSync() { mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); - if (entity == mp.players.local) + if (entity == mp.players.local) { //block player from using LMB to attack mp.game.controls.disableControlAction(32, 24, true); + mp.game.controls.disableControlAction(32, 140, true); + mp.game.controls.disableControlAction(32, 141, true); + mp.game.controls.disableControlAction(32, 142, true); + } let pair = pairData.find(pair => pair.from == string); if (!pair) From f4f42eee73fc4111fa49240ee05089942d0226ec Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 16:03:34 +0200 Subject: [PATCH 037/116] add more inputs --- ReallifeGamemode.Client/util/animationSync.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 920512c8..552c96a0 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -67,6 +67,7 @@ export default function animationSync() { mp.game.controls.disableControlAction(32, 140, true); mp.game.controls.disableControlAction(32, 141, true); mp.game.controls.disableControlAction(32, 142, true); + mp.game.controls.disableControlAction(32, 257, true); } } }); @@ -80,6 +81,7 @@ export default function animationSync() { mp.game.controls.disableControlAction(32, 140, false); mp.game.controls.disableControlAction(32, 141, false); mp.game.controls.disableControlAction(32, 142, false); + mp.game.controls.disableControlAction(32, 257, false); } if (string == null) { @@ -103,6 +105,7 @@ export default function animationSync() { mp.game.controls.disableControlAction(32, 140, true); mp.game.controls.disableControlAction(32, 141, true); mp.game.controls.disableControlAction(32, 142, true); + mp.game.controls.disableControlAction(32, 257, true); } let pair = pairData.find(pair => pair.from == string); From 9d71fb3306a32f6ad8a79b950265b183fc7ed3d3 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 16:39:26 +0200 Subject: [PATCH 038/116] test --- ReallifeGamemode.Client/util/animationSync.ts | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 552c96a0..749e3e53 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -63,11 +63,11 @@ export default function animationSync() { mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); if (player == mp.players.local) { //block player from using LMB to attack - mp.game.controls.disableControlAction(32, 24, true); - mp.game.controls.disableControlAction(32, 140, true); - mp.game.controls.disableControlAction(32, 141, true); - mp.game.controls.disableControlAction(32, 142, true); - mp.game.controls.disableControlAction(32, 257, true); + mp.game.controls.disableControlAction(0, 24, true); + mp.game.controls.disableControlAction(0, 140, true); + mp.game.controls.disableControlAction(0, 141, true); + mp.game.controls.disableControlAction(0, 142, true); + mp.game.controls.disableControlAction(0, 257, true); } } }); @@ -77,11 +77,11 @@ export default function animationSync() { entity.clearTasksImmediately(); if (entity == mp.players.local) { //allow player using LMB to attack - mp.game.controls.disableControlAction(32, 24, false); - mp.game.controls.disableControlAction(32, 140, false); - mp.game.controls.disableControlAction(32, 141, false); - mp.game.controls.disableControlAction(32, 142, false); - mp.game.controls.disableControlAction(32, 257, false); + mp.game.controls.disableControlAction(0, 24, false); + mp.game.controls.disableControlAction(0, 140, false); + mp.game.controls.disableControlAction(0, 141, false); + mp.game.controls.disableControlAction(0, 142, false); + mp.game.controls.disableControlAction(0, 257, false); } if (string == null) { @@ -101,11 +101,11 @@ export default function animationSync() { }); if (entity == mp.players.local) { //block player from using LMB to attack - mp.game.controls.disableControlAction(32, 24, true); - mp.game.controls.disableControlAction(32, 140, true); - mp.game.controls.disableControlAction(32, 141, true); - mp.game.controls.disableControlAction(32, 142, true); - mp.game.controls.disableControlAction(32, 257, true); + mp.game.controls.disableControlAction(0, 24, true); + mp.game.controls.disableControlAction(0, 140, true); + mp.game.controls.disableControlAction(0, 141, true); + mp.game.controls.disableControlAction(0, 142, true); + mp.game.controls.disableControlAction(0, 257, true); } let pair = pairData.find(pair => pair.from == string); From 67b5b8d5f0d2083424586b8119a30210b537e3ca Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 16:46:05 +0200 Subject: [PATCH 039/116] test --- ReallifeGamemode.Client/util/animationSync.ts | 30 ++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 749e3e53..750b9513 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -1,6 +1,6 @@ -import planeSchoolHandle from "./planeschool"; +export default function animationSync() { + let blockInput = false; -export default function animationSync() { mp.events.add("SERVER:LoadAnimations", () => { animationSyncData.register("Cuffed", "mp_arresting", "idle", -1, true, 50); animationSyncData.register("doArrest", "mp_arrest_paired", "cop_p2_back_right", 3000, false, 0); @@ -63,11 +63,7 @@ export default function animationSync() { mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); if (player == mp.players.local) { //block player from using LMB to attack - mp.game.controls.disableControlAction(0, 24, true); - mp.game.controls.disableControlAction(0, 140, true); - mp.game.controls.disableControlAction(0, 141, true); - mp.game.controls.disableControlAction(0, 142, true); - mp.game.controls.disableControlAction(0, 257, true); + blockInput = true; } } }); @@ -77,11 +73,7 @@ export default function animationSync() { entity.clearTasksImmediately(); if (entity == mp.players.local) { //allow player using LMB to attack - mp.game.controls.disableControlAction(0, 24, false); - mp.game.controls.disableControlAction(0, 140, false); - mp.game.controls.disableControlAction(0, 141, false); - mp.game.controls.disableControlAction(0, 142, false); - mp.game.controls.disableControlAction(0, 257, false); + blockInput = false; } if (string == null) { @@ -101,11 +93,7 @@ export default function animationSync() { }); if (entity == mp.players.local) { //block player from using LMB to attack - mp.game.controls.disableControlAction(0, 24, true); - mp.game.controls.disableControlAction(0, 140, true); - mp.game.controls.disableControlAction(0, 141, true); - mp.game.controls.disableControlAction(0, 142, true); - mp.game.controls.disableControlAction(0, 257, true); + blockInput = true; } let pair = pairData.find(pair => pair.from == string); @@ -118,6 +106,14 @@ export default function animationSync() { }, duration); }); + mp.events.add("render", () => { + mp.game.controls.disableControlAction(32, 24, blockInput); + mp.game.controls.disableControlAction(32, 140, blockInput); + mp.game.controls.disableControlAction(32, 141, blockInput); + mp.game.controls.disableControlAction(32, 142, blockInput); + mp.game.controls.disableControlAction(32, 257, blockInput); + }); + function loadAnimDict(animDict, callback) { if (mp.game.streaming.hasAnimDictLoaded(animDict)) return void callback(); mp.game.streaming.requestAnimDict(animDict); From 329667f4fb6f4480d693059c721c57290af11dfb Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 16:52:14 +0200 Subject: [PATCH 040/116] fix --- ReallifeGamemode.Client/util/animationSync.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 750b9513..7343190b 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -92,14 +92,14 @@ mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); - if (entity == mp.players.local) { //block player from using LMB to attack - blockInput = true; - } - let pair = pairData.find(pair => pair.from == string); if (!pair) return; + if (entity == mp.players.local) { //block player from using LMB to attack + blockInput = true; + } + let a = setInterval(function () { mp.events.callRemote("CLIENT:AnimPairTransition", entity, pair.transitionTo); clearInterval(a); From b3fdbccff3fd7e0ab9e42f80b684a49d08047fc8 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 16:55:30 +0200 Subject: [PATCH 041/116] tryfix --- ReallifeGamemode.Client/util/animationSync.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 7343190b..6ccb7840 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -72,10 +72,6 @@ mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => { entity.clearTasksImmediately(); - if (entity == mp.players.local) { //allow player using LMB to attack - blockInput = false; - } - if (string == null) { return; } @@ -96,10 +92,6 @@ if (!pair) return; - if (entity == mp.players.local) { //block player from using LMB to attack - blockInput = true; - } - let a = setInterval(function () { mp.events.callRemote("CLIENT:AnimPairTransition", entity, pair.transitionTo); clearInterval(a); From fb601d508055f686ed459ac186aeb7c95083fab8 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 17:02:54 +0200 Subject: [PATCH 042/116] try fix --- ReallifeGamemode.Client/util/animationSync.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 6ccb7840..b18bb93e 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -71,7 +71,7 @@ mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => { entity.clearTasksImmediately(); - + blockInput = false; if (string == null) { return; } @@ -99,11 +99,9 @@ }); mp.events.add("render", () => { - mp.game.controls.disableControlAction(32, 24, blockInput); - mp.game.controls.disableControlAction(32, 140, blockInput); - mp.game.controls.disableControlAction(32, 141, blockInput); - mp.game.controls.disableControlAction(32, 142, blockInput); - mp.game.controls.disableControlAction(32, 257, blockInput); + if (blockInput) { + mp.game.controls.disableControlAction(32, 24, true); + } }); function loadAnimDict(animDict, callback) { From 8ee68a5a5484c4b9468858969b8bc286b1f57af5 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 17:07:46 +0200 Subject: [PATCH 043/116] fix inputBlocker on Animation Transition --- ReallifeGamemode.Client/util/animationSync.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index b18bb93e..e29e5e7d 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -91,7 +91,7 @@ let pair = pairData.find(pair => pair.from == string); if (!pair) return; - + blockInput = true; let a = setInterval(function () { mp.events.callRemote("CLIENT:AnimPairTransition", entity, pair.transitionTo); clearInterval(a); From b4fb23078bfd0aff617047dbe915627c885f3652 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 17:34:34 +0200 Subject: [PATCH 044/116] /cuff positioning test --- ReallifeGamemode.Client/util/animationSync.ts | 32 ++++++++++++++++--- .../Commands/AdminCommands.cs | 6 ++-- ReallifeGamemode.Server/Events/PlayerEvent.cs | 16 ++++++++++ .../Extensions/ClientExtension.cs | 12 +++++-- ReallifeGamemode.Server/Util/AnimationSync.cs | 6 ++++ 5 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 ReallifeGamemode.Server/Events/PlayerEvent.cs diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index e29e5e7d..d7b21703 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -51,8 +51,9 @@ setInterval(() => { mp.players.forEachInStreamRange( (player) => { - if (!player.getVariable("AnimationData")) + if (!player.getVariable("AnimationData")) { return; + } let index = mp.game.joaat(player.getVariable("AnimationData")); let currentAnim = animationSyncData.animations[index]; @@ -62,16 +63,20 @@ loadAnimDict(animDict, function () { mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); - if (player == mp.players.local) { //block player from using LMB to attack + if (player == mp.players.local) { blockInput = true; } + } else if (!loop) { + if (player == mp.players.local) { + blockInput = false; + mp.events.callRemote("CLIENT:ClearAnimationData", player); + } } }); }, 100); mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => { entity.clearTasksImmediately(); - blockInput = false; if (string == null) { return; } @@ -88,12 +93,15 @@ mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); + blockInput = true; + let pair = pairData.find(pair => pair.from == string); if (!pair) return; - blockInput = true; let a = setInterval(function () { - mp.events.callRemote("CLIENT:AnimPairTransition", entity, pair.transitionTo); + if (entity == mp.players.local) { + mp.events.callRemote("CLIENT:AnimPairTransition", entity, pair.transitionTo); + } clearInterval(a); }, duration); }); @@ -101,6 +109,7 @@ mp.events.add("render", () => { if (blockInput) { mp.game.controls.disableControlAction(32, 24, true); + mp.game.controls.disableControlAction(32, 22, true); } }); @@ -111,4 +120,17 @@ mp.game.streaming.hasAnimDictLoaded(animDict) && (clearInterval(c), callback()) }, 100) } + + mp.events.add("SERVER:GetInFrontPosition", () => { + let player = mp.players.local; + let result = xyInFrontOfPos(player.position, player.heading, 0.5); + mp.events.callRemote("CLIENT:SET_InFrontOfPos", result); + }); + + function xyInFrontOfPos(pos, heading, dist): Vector3Mp { + heading *= Math.PI / 180 + pos.x += (dist * Math.sin(-heading)) + pos.y += (dist * Math.cos(-heading)) + return pos; + } } \ No newline at end of file diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 4f5bc0a9..b121085a 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -46,10 +46,8 @@ namespace ReallifeGamemode.Server.Commands if (target.Id == player.Id) return; - float rad = player.Heading * MathF.PI / 180; - Vector3 forwardV3 = new Vector3(player.Position.X + (1.2 * MathF.Sin(rad)), player.Position.Y + (1.2 * MathF.Cos(rad)), player.Position.Z); - - target.Position = forwardV3; + target.Position = player.GetInFrontOfPosition(); + target.Heading = player.Heading; if (!target.HasAnimation("Cuffed")) { diff --git a/ReallifeGamemode.Server/Events/PlayerEvent.cs b/ReallifeGamemode.Server/Events/PlayerEvent.cs new file mode 100644 index 00000000..e159bab5 --- /dev/null +++ b/ReallifeGamemode.Server/Events/PlayerEvent.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; +using GTANetworkAPI; + +namespace ReallifeGamemode.Server.Events +{ + internal class PlayerEvent : Script + { + [RemoteEvent("CLIENT:SET_InFrontOfPos")] + public void SetFrontOfPos(Player player, Vector3 pos) + { + player.SetSharedData("InFrontOf", pos); + } + } +} diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index ebdee723..bea9af66 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -77,10 +77,12 @@ namespace ReallifeGamemode.Server.Extensions var user = player.GetUser(); return user.GetData("duty", false); } + public static bool IsAdminDuty(this Player player) { return player.HasData("Adminduty") ? player.GetData("Adminduty") : false; } + public static Vector3 GetPositionFromPlayer(Player player, float distance, int offset = 0) { var pos = player.Position; @@ -268,11 +270,11 @@ namespace ReallifeGamemode.Server.Extensions } else if (user.FactionId != null) { - if(user.FactionId > 3 || (user.FactionId >= 1 && user.FactionId <= 3 && duty)) + if (user.FactionId > 3 || (user.FactionId >= 1 && user.FactionId <= 3 && duty)) { nameTagColor = user.FactionId.Value; } - + switch (user.FactionId) { case 1 when duty: @@ -314,5 +316,11 @@ namespace ReallifeGamemode.Server.Extensions user.Player.SetSharedData("nameTagColor", nameTagColor); user.Player.SetSharedData("blipColor", blipColor); } + + public static Vector3 GetInFrontOfPosition(this Player player) + { + player.TriggerEvent("SERVER:GetInFrontPosition"); + return player.GetSharedData("InFrontOf"); + } } } diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index 7ff3d3ad..6d1b47c4 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -56,6 +56,12 @@ namespace ReallifeGamemode.Server.Util target.SyncAnimation(transitionTo); } + [RemoteEvent("CLIENT:ClearAnimationData")] + public void ClearAnimationData(Player player, Player target) + { + target.ClearAnimation(); + } + [ServerEvent(Event.PlayerWeaponSwitch)] public void OnPlayerWeaponSwitch(Player player, WeaponHash oldWeapon, WeaponHash newWeapon) { From 5ebdbb67ca124319a4170800defa96e0ccb49e53 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 18:09:25 +0200 Subject: [PATCH 045/116] test --- ReallifeGamemode.Client/util/animationSync.ts | 10 ++++- .../Commands/AdminCommands.cs | 38 ++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index d7b21703..fc3b54f8 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -66,7 +66,7 @@ if (player == mp.players.local) { blockInput = true; } - } else if (!loop) { + } else if (!loop && player.isPlayingAnim(animDict, animName, 3)) { if (player == mp.players.local) { blockInput = false; mp.events.callRemote("CLIENT:ClearAnimationData", player); @@ -127,6 +127,14 @@ mp.events.callRemote("CLIENT:SET_InFrontOfPos", result); }); + mp.events.add("SERVER:GetInFrontOfPlayer", (entity: PlayerMp) => { + let player = mp.players.local; + let result = xyInFrontOfPos(entity.position, entity.heading, 0.5); + result.z = player.position.z; + mp.players.local.heading = entity.heading; + mp.players.local.position = result; + }); + function xyInFrontOfPos(pos, heading, dist): Vector3Mp { heading *= Math.PI / 180 pos.x += (dist * Math.sin(-heading)) diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index b121085a..880b840f 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -34,6 +34,39 @@ namespace ReallifeGamemode.Server.Commands { #region Todo + [Command("test_cuff1")] + public void TestCuff1(Player player, string nameOrId) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + Player target = PlayerService.GetPlayerByNameOrId(nameOrId); + if (target.Id == player.Id) + return; + + Vector3 front = player.GetInFrontOfPosition(); + front.Z = player.Position.Z; + target.Position = front; + target.Heading = player.Heading; + } + + [Command("test_cuff2")] + public void TestCuff2(Player player, string nameOrId) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + Player target = PlayerService.GetPlayerByNameOrId(nameOrId); + if (target.Id == player.Id) + return; + + target.TriggerEvent("SERVER:GetInFrontOfPlayer", player); + } + [Command("cuff", "~m~Benutzung: ~s~/cuff [ID]")] public void CmdCuffTest(Player player, string nameOrId) { @@ -46,7 +79,10 @@ namespace ReallifeGamemode.Server.Commands if (target.Id == player.Id) return; - target.Position = player.GetInFrontOfPosition(); + Vector3 front = player.GetInFrontOfPosition(); + front.Z = player.Position.Z; + + target.Position = front; target.Heading = player.Heading; if (!target.HasAnimation("Cuffed")) From 62cde419f967470d6b2c6874fab0d1f9b1e5f656 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 18:18:52 +0200 Subject: [PATCH 046/116] test --- ReallifeGamemode.Client/util/animationSync.ts | 3 +-- ReallifeGamemode.Server/Commands/AdminCommands.cs | 2 +- ReallifeGamemode.Server/Events/PlayerEvent.cs | 2 +- ReallifeGamemode.Server/Extensions/ClientExtension.cs | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index fc3b54f8..26bf4694 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -123,8 +123,7 @@ mp.events.add("SERVER:GetInFrontPosition", () => { let player = mp.players.local; - let result = xyInFrontOfPos(player.position, player.heading, 0.5); - mp.events.callRemote("CLIENT:SET_InFrontOfPos", result); + mp.events.callRemote("CLIENT:SET_InFrontOfPos", player.getOffsetFromInWorldCoords(0, 1, 0)); }); mp.events.add("SERVER:GetInFrontOfPlayer", (entity: PlayerMp) => { diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 880b840f..d967e836 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -47,7 +47,7 @@ namespace ReallifeGamemode.Server.Commands return; Vector3 front = player.GetInFrontOfPosition(); - front.Z = player.Position.Z; + //front.Z = player.Position.Z; target.Position = front; target.Heading = player.Heading; } diff --git a/ReallifeGamemode.Server/Events/PlayerEvent.cs b/ReallifeGamemode.Server/Events/PlayerEvent.cs index e159bab5..961d4b23 100644 --- a/ReallifeGamemode.Server/Events/PlayerEvent.cs +++ b/ReallifeGamemode.Server/Events/PlayerEvent.cs @@ -10,7 +10,7 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("CLIENT:SET_InFrontOfPos")] public void SetFrontOfPos(Player player, Vector3 pos) { - player.SetSharedData("InFrontOf", pos); + player.SetData("InFrontOf", pos); } } } diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index bea9af66..ba689464 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -320,7 +320,7 @@ namespace ReallifeGamemode.Server.Extensions public static Vector3 GetInFrontOfPosition(this Player player) { player.TriggerEvent("SERVER:GetInFrontPosition"); - return player.GetSharedData("InFrontOf"); + return player.GetData("InFrontOf"); } } } From 2e648b430095edcb3624d4ac7c073a1fa3c1baac Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 18:25:30 +0200 Subject: [PATCH 047/116] fix --- ReallifeGamemode.Client/util/animationSync.ts | 3 ++- ReallifeGamemode.Server/Extensions/ClientExtension.cs | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 26bf4694..bc72c362 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -58,6 +58,7 @@ let index = mp.game.joaat(player.getVariable("AnimationData")); let currentAnim = animationSyncData.animations[index]; let { id, name, animDict, animName, duration, loop, flag } = currentAnim; + let pair = pairData.find(pair => pair.from == name); if (loop && !player.isPlayingAnim(animDict, animName, 3)) { loadAnimDict(animDict, function () { @@ -66,7 +67,7 @@ if (player == mp.players.local) { blockInput = true; } - } else if (!loop && player.isPlayingAnim(animDict, animName, 3)) { + } else if (!loop && player.isPlayingAnim(animDict, animName, 3) && !pair) { if (player == mp.players.local) { blockInput = false; mp.events.callRemote("CLIENT:ClearAnimationData", player); diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index ba689464..02be10d0 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -319,8 +319,13 @@ namespace ReallifeGamemode.Server.Extensions public static Vector3 GetInFrontOfPosition(this Player player) { + player.ResetData("InFrontOf"); player.TriggerEvent("SERVER:GetInFrontPosition"); - return player.GetData("InFrontOf"); + while (true) + { + if (player.HasData("InFrontOf")) + return player.GetData("InFrontOf"); + } } } } From 2b92e7134f2ce80ac1ef163bce4277066b938a52 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 18:29:06 +0200 Subject: [PATCH 048/116] fix --- ReallifeGamemode.Server/Extensions/ClientExtension.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index 02be10d0..a72aab91 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -321,11 +321,8 @@ namespace ReallifeGamemode.Server.Extensions { player.ResetData("InFrontOf"); player.TriggerEvent("SERVER:GetInFrontPosition"); - while (true) - { - if (player.HasData("InFrontOf")) - return player.GetData("InFrontOf"); - } + System.Threading.Thread.Sleep(500); + return player.GetData("InFrontOf"); } } } From 4654638d9e07de75255e2960aa18d43111d6d20c Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 18:48:18 +0200 Subject: [PATCH 049/116] test --- ReallifeGamemode.Client/util/animationSync.ts | 5 ++--- .../Commands/AdminCommands.cs | 19 +------------------ ReallifeGamemode.Server/Events/PlayerEvent.cs | 2 +- .../Extensions/ClientExtension.cs | 7 ++----- 4 files changed, 6 insertions(+), 27 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index bc72c362..34a5ae19 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -122,9 +122,8 @@ }, 100) } - mp.events.add("SERVER:GetInFrontPosition", () => { - let player = mp.players.local; - mp.events.callRemote("CLIENT:SET_InFrontOfPos", player.getOffsetFromInWorldCoords(0, 1, 0)); + mp.events.add("SERVER:SetInFrontPosition", (entity) => { + mp.events.callRemote("CLIENT:SET_InFrontOfPos", entity.getOffsetFromInWorldCoords(0, 1, 0)); }); mp.events.add("SERVER:GetInFrontOfPlayer", (entity: PlayerMp) => { diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index d967e836..56e00db1 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -46,27 +46,10 @@ namespace ReallifeGamemode.Server.Commands if (target.Id == player.Id) return; - Vector3 front = player.GetInFrontOfPosition(); - //front.Z = player.Position.Z; - target.Position = front; + target.SetInFrontOf(player); target.Heading = player.Heading; } - [Command("test_cuff2")] - public void TestCuff2(Player player, string nameOrId) - { - if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) - { - ChatService.NotAuthorized(player); - return; - } - Player target = PlayerService.GetPlayerByNameOrId(nameOrId); - if (target.Id == player.Id) - return; - - target.TriggerEvent("SERVER:GetInFrontOfPlayer", player); - } - [Command("cuff", "~m~Benutzung: ~s~/cuff [ID]")] public void CmdCuffTest(Player player, string nameOrId) { diff --git a/ReallifeGamemode.Server/Events/PlayerEvent.cs b/ReallifeGamemode.Server/Events/PlayerEvent.cs index 961d4b23..abd12a3c 100644 --- a/ReallifeGamemode.Server/Events/PlayerEvent.cs +++ b/ReallifeGamemode.Server/Events/PlayerEvent.cs @@ -10,7 +10,7 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("CLIENT:SET_InFrontOfPos")] public void SetFrontOfPos(Player player, Vector3 pos) { - player.SetData("InFrontOf", pos); + player.Position = pos; } } } diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index a72aab91..96b81700 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -317,12 +317,9 @@ namespace ReallifeGamemode.Server.Extensions user.Player.SetSharedData("blipColor", blipColor); } - public static Vector3 GetInFrontOfPosition(this Player player) + public static void SetInFrontOf(this Player player, Entity entity) { - player.ResetData("InFrontOf"); - player.TriggerEvent("SERVER:GetInFrontPosition"); - System.Threading.Thread.Sleep(500); - return player.GetData("InFrontOf"); + player.TriggerEvent("SERVER:SetInFrontPosition", entity); } } } From b2d82b8e0a997d7a72e6953c98cb6565f92d3860 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 18:53:13 +0200 Subject: [PATCH 050/116] typo --- ReallifeGamemode.Server/Commands/AdminCommands.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 56e00db1..8b6e21f4 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -62,10 +62,7 @@ namespace ReallifeGamemode.Server.Commands if (target.Id == player.Id) return; - Vector3 front = player.GetInFrontOfPosition(); - front.Z = player.Position.Z; - - target.Position = front; + target.SetInFrontOf(player); target.Heading = player.Heading; if (!target.HasAnimation("Cuffed")) From 7347c0c1af8510c20d3c800d76d2fc6ff363dbf7 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 18:59:17 +0200 Subject: [PATCH 051/116] fix animation cut --- ReallifeGamemode.Client/util/animationSync.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 34a5ae19..e97aed7f 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -68,10 +68,13 @@ blockInput = true; } } else if (!loop && player.isPlayingAnim(animDict, animName, 3) && !pair) { - if (player == mp.players.local) { - blockInput = false; - mp.events.callRemote("CLIENT:ClearAnimationData", player); - } + let a = setInterval(function () { + if (player == mp.players.local) { + blockInput = false; + mp.events.callRemote("CLIENT:ClearAnimationData", player); + } + clearInterval(a); + }, duration); } }); }, 100); @@ -79,6 +82,7 @@ mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => { entity.clearTasksImmediately(); if (string == null) { + blockInput = false; return; } From 9e3ac170dbba8e23085a7a4d7d0a9497447fd585 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 19:05:03 +0200 Subject: [PATCH 052/116] try fix --- ReallifeGamemode.Client/util/animationSync.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index e97aed7f..be395bf0 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -59,6 +59,8 @@ let currentAnim = animationSyncData.animations[index]; let { id, name, animDict, animName, duration, loop, flag } = currentAnim; let pair = pairData.find(pair => pair.from == name); + if (pair) + return; if (loop && !player.isPlayingAnim(animDict, animName, 3)) { loadAnimDict(animDict, function () { @@ -67,7 +69,7 @@ if (player == mp.players.local) { blockInput = true; } - } else if (!loop && player.isPlayingAnim(animDict, animName, 3) && !pair) { + } else if (!loop && player.isPlayingAnim(animDict, animName, 3)) { let a = setInterval(function () { if (player == mp.players.local) { blockInput = false; From be658655859f0c6fa8853c1083f2445cb1ee64b3 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 19:13:00 +0200 Subject: [PATCH 053/116] try fix --- ReallifeGamemode.Client/util/animationSync.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index be395bf0..bb8dc3e3 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -3,7 +3,7 @@ mp.events.add("SERVER:LoadAnimations", () => { animationSyncData.register("Cuffed", "mp_arresting", "idle", -1, true, 50); - animationSyncData.register("doArrest", "mp_arrest_paired", "cop_p2_back_right", 3000, false, 0); + animationSyncData.register("doArrest", "mp_arrest_paired", "cop_p2_back_right", 3760, false, 0); animationSyncData.register("getArrest", "mp_arrest_paired", "crook_p2_back_right", 3760, false, 0); animationSyncData.register("doUncuff", "mp_arresting", "a_uncuff", 5500, false, 0); animationSyncData.register("getUncuff", "mp_arresting", "b_uncuff", 5500, false, 0); @@ -59,10 +59,8 @@ let currentAnim = animationSyncData.animations[index]; let { id, name, animDict, animName, duration, loop, flag } = currentAnim; let pair = pairData.find(pair => pair.from == name); - if (pair) - return; - if (loop && !player.isPlayingAnim(animDict, animName, 3)) { + if (loop && !player.isPlayingAnim(animDict, animName, 3) && pair) { loadAnimDict(animDict, function () { mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); @@ -97,7 +95,7 @@ let { id, name, animDict, animName, duration, loop, flag } = animData; loadAnimDict(animDict, function () { - mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) }); blockInput = true; From 6463114ccf94266d4d426e8e59d5b476c958833b Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 19:20:56 +0200 Subject: [PATCH 054/116] test --- ReallifeGamemode.Client/util/animationSync.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index bb8dc3e3..ac88ec1d 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -49,11 +49,19 @@ */ setInterval(() => { + if (mp.players.local.getVariable("AnimationData")) { + blockInput = true; + } else { + blockInput = false; + } + mp.players.forEachInStreamRange( (player) => { if (!player.getVariable("AnimationData")) { return; } + if (player != mp.players.local) + mp.game.wait(200); let index = mp.game.joaat(player.getVariable("AnimationData")); let currentAnim = animationSyncData.animations[index]; @@ -64,13 +72,9 @@ loadAnimDict(animDict, function () { mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); - if (player == mp.players.local) { - blockInput = true; - } } else if (!loop && player.isPlayingAnim(animDict, animName, 3)) { let a = setInterval(function () { if (player == mp.players.local) { - blockInput = false; mp.events.callRemote("CLIENT:ClearAnimationData", player); } clearInterval(a); @@ -82,7 +86,6 @@ mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => { entity.clearTasksImmediately(); if (string == null) { - blockInput = false; return; } @@ -95,11 +98,9 @@ let { id, name, animDict, animName, duration, loop, flag } = animData; loadAnimDict(animDict, function () { - mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); - blockInput = true; - let pair = pairData.find(pair => pair.from == string); if (!pair) return; From 9023bf6c7ca34544ee115000bb1cee02c37761ab Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 19:23:33 +0200 Subject: [PATCH 055/116] fix --- ReallifeGamemode.Client/util/animationSync.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index ac88ec1d..1836de81 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -60,8 +60,6 @@ if (!player.getVariable("AnimationData")) { return; } - if (player != mp.players.local) - mp.game.wait(200); let index = mp.game.joaat(player.getVariable("AnimationData")); let currentAnim = animationSyncData.animations[index]; @@ -70,7 +68,7 @@ if (loop && !player.isPlayingAnim(animDict, animName, 3) && pair) { loadAnimDict(animDict, function () { - mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) + mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) }); } else if (!loop && player.isPlayingAnim(animDict, animName, 3)) { let a = setInterval(function () { @@ -98,7 +96,7 @@ let { id, name, animDict, animName, duration, loop, flag } = animData; loadAnimDict(animDict, function () { - mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) }); let pair = pairData.find(pair => pair.from == string); From a106b916dcae1f33e48c9aaa5a728ac1b8a2e882 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 20:03:32 +0200 Subject: [PATCH 056/116] test --- ReallifeGamemode.Client/util/animationSync.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 1836de81..94e045cf 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -64,13 +64,12 @@ let index = mp.game.joaat(player.getVariable("AnimationData")); let currentAnim = animationSyncData.animations[index]; let { id, name, animDict, animName, duration, loop, flag } = currentAnim; - let pair = pairData.find(pair => pair.from == name); - if (loop && !player.isPlayingAnim(animDict, animName, 3) && pair) { + if (loop && !player.isPlayingAnim(animDict, animName, 3)) { loadAnimDict(animDict, function () { mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) }); - } else if (!loop && player.isPlayingAnim(animDict, animName, 3)) { + } else if (!loop) { let a = setInterval(function () { if (player == mp.players.local) { mp.events.callRemote("CLIENT:ClearAnimationData", player); @@ -112,6 +111,7 @@ mp.events.add("render", () => { if (blockInput) { + mp.game.controls.disableControlAction(32, 25, true); mp.game.controls.disableControlAction(32, 24, true); mp.game.controls.disableControlAction(32, 22, true); } From b993485906ecf3a53a9a6e4311f6aa4561e34469 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 20:23:55 +0200 Subject: [PATCH 057/116] test command --- ReallifeGamemode.Client/util/animationSync.ts | 8 ++------ ReallifeGamemode.Server/Commands/AdminCommands.cs | 6 +++--- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 94e045cf..a2f604c8 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -129,12 +129,8 @@ mp.events.callRemote("CLIENT:SET_InFrontOfPos", entity.getOffsetFromInWorldCoords(0, 1, 0)); }); - mp.events.add("SERVER:GetInFrontOfPlayer", (entity: PlayerMp) => { - let player = mp.players.local; - let result = xyInFrontOfPos(entity.position, entity.heading, 0.5); - result.z = player.position.z; - mp.players.local.heading = entity.heading; - mp.players.local.position = result; + mp.events.add("attach to Player", (entity: PlayerMp) => { + entity.attachTo(mp.players.local.handle, 0, 0, 1, 0, 0, 0, 0, false, false, false, true, 2, true); }); function xyInFrontOfPos(pos, heading, dist): Vector3Mp { diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 8b6e21f4..652b72a3 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -45,9 +45,9 @@ namespace ReallifeGamemode.Server.Commands Player target = PlayerService.GetPlayerByNameOrId(nameOrId); if (target.Id == player.Id) return; - - target.SetInFrontOf(player); - target.Heading = player.Heading; + //target.SetInFrontOf(player); + //target.Heading = player.Heading; + player.TriggerEvent("attach to Player", target); } [Command("cuff", "~m~Benutzung: ~s~/cuff [ID]")] From c91760cd2dd77497099dcbe7dce858f17223b6ce Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 5 Apr 2021 20:52:38 +0200 Subject: [PATCH 058/116] hup chat message --- ReallifeGamemode.Server/Commands/UserCommands.cs | 1 + ReallifeGamemode.Server/Services/ChatService.cs | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Commands/UserCommands.cs b/ReallifeGamemode.Server/Commands/UserCommands.cs index f61103e3..3804adc0 100644 --- a/ReallifeGamemode.Server/Commands/UserCommands.cs +++ b/ReallifeGamemode.Server/Commands/UserCommands.cs @@ -108,6 +108,7 @@ namespace ReallifeGamemode.Server.Commands { player.StopAnimation(); player.PlayAnimation("mp_am_hold_up", "handsup_base", (int)(AnimationFlags.Loop | AnimationFlags.OnlyAnimateUpperBody | AnimationFlags.AllowPlayerControl | AnimationFlags.Cancellable)); + ChatService.SendInRange(player.Position, 20, $"~m~{player.Name} stellt sich..."); } [Command("event", "~m~Benutzung: ~s~/event [Nachricht]", GreedyArg = true)] diff --git a/ReallifeGamemode.Server/Services/ChatService.cs b/ReallifeGamemode.Server/Services/ChatService.cs index 692c4263..255b30ad 100644 --- a/ReallifeGamemode.Server/Services/ChatService.cs +++ b/ReallifeGamemode.Server/Services/ChatService.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using GTANetworkAPI; using ReallifeGamemode.Database.Entities; @@ -115,6 +116,17 @@ namespace ReallifeGamemode.Server.Services }); } + internal static void SendInRange(Vector3 position, int range, string message) + { + foreach(Player player in NAPI.Pools.GetAllPlayers()) + { + if(player.Position.DistanceTo(position) <= range) + { + SendMessage(player, message); + } + } + } + public static void BroadcastGroup(string message, Group group) { message = $"!{{FF8080}}** Gruppe: {message}"; From b571ae72cacd82536921e39a47d0cf51fc2e26b8 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 5 Apr 2021 21:45:38 +0200 Subject: [PATCH 059/116] fix leaderchat --- ReallifeGamemode.Server/Commands/FactionCommands.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Commands/FactionCommands.cs b/ReallifeGamemode.Server/Commands/FactionCommands.cs index faae6191..ac032bbb 100644 --- a/ReallifeGamemode.Server/Commands/FactionCommands.cs +++ b/ReallifeGamemode.Server/Commands/FactionCommands.cs @@ -226,7 +226,7 @@ namespace ReallifeGamemode.Server.Commands NAPI.Pools.GetAllPlayers().ForEach(p => { User pUser = p.GetUser(); - if (pUser.FactionLeader || pUser.IsAdmin(AdminLevel.ADMIN)) + if ((pUser?.FactionLeader ?? false) || pUser.IsAdmin(AdminLevel.ADMIN)) { ChatService.SendMessage(p, broadcastMsg); } From 4ed7d4c597cec012bad8c13ab5c68ffa723e90ac Mon Sep 17 00:00:00 2001 From: hydrant Date: Tue, 6 Apr 2021 19:46:55 +0200 Subject: [PATCH 060/116] aduty kein shop vehicle dialog --- ReallifeGamemode.Server/Managers/BusinessManager.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ReallifeGamemode.Server/Managers/BusinessManager.cs b/ReallifeGamemode.Server/Managers/BusinessManager.cs index 7603df43..875d3c9a 100644 --- a/ReallifeGamemode.Server/Managers/BusinessManager.cs +++ b/ReallifeGamemode.Server/Managers/BusinessManager.cs @@ -129,6 +129,11 @@ namespace ReallifeGamemode.Server.Managers [ServerEvent(Event.PlayerEnterVehicle)] public void CarDealerBusiness_PlayerEnterVehicle(Player player, Vehicle veh, int seat) { + if(player.IsAdminDuty()) + { + return; + } + ServerVehicle sVeh = veh.GetServerVehicle(); if (sVeh == null) return; if (!(sVeh is ShopVehicle)) return; From bb1ae4bdc16cc2411076206b69a465e2a095f072 Mon Sep 17 00:00:00 2001 From: hydrant Date: Tue, 6 Apr 2021 19:47:08 +0200 Subject: [PATCH 061/116] postbuild dlcpacks richtig kopieren --- postbuild.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postbuild.ps1 b/postbuild.ps1 index c93bf675..4d1396ef 100644 --- a/postbuild.ps1 +++ b/postbuild.ps1 @@ -25,7 +25,7 @@ Set-Variable resourcesDir -option Constant -value "dotnet\resources" Set-Variable gamemodeDir -option Constant -value "reallife-gamemode" Set-Variable assetsDir -option Constant -value "client_packages\assets" Set-Variable indexJsDir -option Constant -value "client_packages" -Set-Variable dlcPacksDir -option Constant -value "source_dlcpacks" +Set-Variable dlcPacksDir -option Constant -value "client_packages\game_resources\dlcpacks" Set-Variable fullBuildDir -option Constant -value "$serverProjectPath\$buildDirectory" # create default config file if not exist From a09690b58c8a687e65985c8b4d91840b9bca6400 Mon Sep 17 00:00:00 2001 From: hydrant Date: Tue, 6 Apr 2021 19:47:25 +0200 Subject: [PATCH 062/116] unique index auf user.name --- ...0405190220_UserNameUniqueIndex.Designer.cs | 1885 +++++++++++++++++ .../20210405190220_UserNameUniqueIndex.cs | 23 + .../DatabaseContextModelSnapshot.cs | 3 + .../Models/DatabaseContext.cs | 14 +- 4 files changed, 1922 insertions(+), 3 deletions(-) create mode 100644 ReallifeGamemode.Database/Migrations/20210405190220_UserNameUniqueIndex.Designer.cs create mode 100644 ReallifeGamemode.Database/Migrations/20210405190220_UserNameUniqueIndex.cs diff --git a/ReallifeGamemode.Database/Migrations/20210405190220_UserNameUniqueIndex.Designer.cs b/ReallifeGamemode.Database/Migrations/20210405190220_UserNameUniqueIndex.Designer.cs new file mode 100644 index 00000000..0da9a04a --- /dev/null +++ b/ReallifeGamemode.Database/Migrations/20210405190220_UserNameUniqueIndex.Designer.cs @@ -0,0 +1,1885 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using ReallifeGamemode.Database.Models; + +namespace ReallifeGamemode.Database.Migrations +{ + [DbContext(typeof(DatabaseContext))] + [Migration("20210405190220_UserNameUniqueIndex")] + partial class UserNameUniqueIndex + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "3.1.3") + .HasAnnotation("PropertyAccessMode", PropertyAccessMode.PreferFieldDuringConstruction) + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ATM", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("Faulty") + .HasColumnType("tinyint(1)"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("ATMs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Ban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Applied") + .HasColumnType("int"); + + b.Property("BannedBy") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Reason") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("UntilDateTime") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Bans"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoute", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("BusRoutes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoutePoint", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BusRouteId") + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("BusRouteId"); + + b.ToTable("BusRoutesPoints"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusinessBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("BusinessId") + .IsUnique(); + + b.ToTable("BusinessBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusinessData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("BusinessData"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Character", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ageing") + .HasColumnType("tinyint unsigned"); + + b.Property("AgeingOpacity") + .HasColumnType("float"); + + b.Property("BeardColor") + .HasColumnType("tinyint unsigned"); + + b.Property("Blemishes") + .HasColumnType("tinyint unsigned"); + + b.Property("BlemishesOpacity") + .HasColumnType("float"); + + b.Property("Blush") + .HasColumnType("tinyint unsigned"); + + b.Property("BlushColor") + .HasColumnType("tinyint unsigned"); + + b.Property("BlushOpacity") + .HasColumnType("float"); + + b.Property("BrowDepth") + .HasColumnType("float"); + + b.Property("BrowHeight") + .HasColumnType("float"); + + b.Property("CheekDepth") + .HasColumnType("float"); + + b.Property("CheekboneHeight") + .HasColumnType("float"); + + b.Property("CheekboneWidth") + .HasColumnType("float"); + + b.Property("ChestHair") + .HasColumnType("tinyint unsigned"); + + b.Property("ChestHairColor") + .HasColumnType("tinyint unsigned"); + + b.Property("ChestHairOpacity") + .HasColumnType("float"); + + b.Property("ChinDepth") + .HasColumnType("float"); + + b.Property("ChinHeight") + .HasColumnType("float"); + + b.Property("ChinIndent") + .HasColumnType("float"); + + b.Property("ChinWidth") + .HasColumnType("float"); + + b.Property("Complexion") + .HasColumnType("tinyint unsigned"); + + b.Property("ComplexionOpacity") + .HasColumnType("float"); + + b.Property("EyeColor") + .HasColumnType("tinyint unsigned"); + + b.Property("EyeSize") + .HasColumnType("float"); + + b.Property("EyebrowColor") + .HasColumnType("tinyint unsigned"); + + b.Property("Eyebrows") + .HasColumnType("tinyint unsigned"); + + b.Property("EyebrowsOpacity") + .HasColumnType("float"); + + b.Property("FacialHair") + .HasColumnType("tinyint unsigned"); + + b.Property("FacialHairOpacity") + .HasColumnType("float"); + + b.Property("Father") + .HasColumnType("tinyint unsigned"); + + b.Property("Freckles") + .HasColumnType("tinyint unsigned"); + + b.Property("FrecklesOpacity") + .HasColumnType("float"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("Hair") + .HasColumnType("tinyint unsigned"); + + b.Property("HairColor") + .HasColumnType("tinyint unsigned"); + + b.Property("HairHighlightColor") + .HasColumnType("tinyint unsigned"); + + b.Property("JawShape") + .HasColumnType("float"); + + b.Property("JawWidth") + .HasColumnType("float"); + + b.Property("LipThickness") + .HasColumnType("float"); + + b.Property("Lipstick") + .HasColumnType("tinyint unsigned"); + + b.Property("LipstickColor") + .HasColumnType("tinyint unsigned"); + + b.Property("LipstickOpacity") + .HasColumnType("float"); + + b.Property("Makeup") + .HasColumnType("tinyint unsigned"); + + b.Property("MakeupOpacity") + .HasColumnType("float"); + + b.Property("Mother") + .HasColumnType("tinyint unsigned"); + + b.Property("NeckWidth") + .HasColumnType("float"); + + b.Property("NoseBottomHeight") + .HasColumnType("float"); + + b.Property("NoseBridgeDepth") + .HasColumnType("float"); + + b.Property("NoseBroken") + .HasColumnType("float"); + + b.Property("NoseTipHeight") + .HasColumnType("float"); + + b.Property("NoseTipLength") + .HasColumnType("float"); + + b.Property("NoseWidth") + .HasColumnType("float"); + + b.Property("Similarity") + .HasColumnType("float"); + + b.Property("SkinSimilarity") + .HasColumnType("float"); + + b.Property("SunDamage") + .HasColumnType("tinyint unsigned"); + + b.Property("SunDamageOpacity") + .HasColumnType("float"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Characters"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.CharacterCloth", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClothId") + .HasColumnType("int"); + + b.Property("Duty") + .HasColumnType("tinyint(1)"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("SlotType") + .HasColumnType("tinyint unsigned"); + + b.Property("Texture") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("CharacterClothes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ClothCombination", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("Top") + .HasColumnType("int"); + + b.Property("Torso") + .HasColumnType("int"); + + b.Property("Undershirt") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("ClothCombinations"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Door", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Category") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Locked") + .HasColumnType("tinyint(1)"); + + b.Property("Model") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Radius") + .HasColumnType("float"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("Doors"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.DutyCloth", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClothId") + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("SlotType") + .HasColumnType("tinyint unsigned"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("DutyClothes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Faction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("GangOwned") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("StateOwned") + .HasColumnType("tinyint(1)"); + + b.Property("WeaponDealTime") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("BankAccountId"); + + b.ToTable("Factions"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("Bic") + .HasColumnType("varchar(12) CHARACTER SET utf8mb4") + .HasMaxLength(12); + + b.Property("Iban") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.HasKey("Id"); + + b.ToTable("FactionBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionRank", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("RankName") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("FactionRanks"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionWeapon", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ammount") + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Rank") + .HasColumnType("int"); + + b.Property("SlotID") + .HasColumnType("int"); + + b.Property("WeaponModel") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("FactionWeapons"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GotoPoint", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Description") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("GotoPoints"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Group", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("BankAccountId"); + + b.ToTable("Groups"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Balance") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("GroupBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.House", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("CanRentIn") + .HasColumnType("tinyint(1)"); + + b.Property("LastRentSetTime") + .HasColumnType("datetime(6)"); + + b.Property("OwnerId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("RentalFee") + .HasColumnType("int"); + + b.Property("Type") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("BankAccountId"); + + b.HasIndex("OwnerId"); + + b.ToTable("Houses"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Balance") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("HouseBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseRental", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("HouseId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("HouseId"); + + b.HasIndex("UserId"); + + b.ToTable("HouseRentals"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Interior", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("EnterPositionStr") + .HasColumnName("EnterPosition") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("ExitPositionStr") + .HasColumnName("ExitPosition") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("Interiors"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Location", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Heading") + .HasColumnType("double"); + + b.Property("X") + .HasColumnType("double"); + + b.Property("Y") + .HasColumnType("double"); + + b.Property("Z") + .HasColumnType("double"); + + b.HasKey("Id"); + + b.ToTable("Locations"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.BankAccountTransactionHistory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Fee") + .HasColumnType("int"); + + b.Property("MoneySent") + .HasColumnType("int"); + + b.Property("NewReceiverBalance") + .HasColumnType("int"); + + b.Property("NewSenderBalance") + .HasColumnType("int"); + + b.Property("Origin") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Receiver") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("ReceiverBalance") + .HasColumnType("int"); + + b.Property("Sender") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("SenderBalance") + .HasColumnType("int"); + + b.Property("Timestamp") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.ToTable("BankAccountTransactionLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Death", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("CauseOfDeath") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("KillerHeading") + .HasColumnType("float"); + + b.Property("KillerId") + .HasColumnType("int"); + + b.Property("KillerPositionX") + .HasColumnType("float"); + + b.Property("KillerPositionY") + .HasColumnType("float"); + + b.Property("KillerPositionZ") + .HasColumnType("float"); + + b.Property("Timestamp") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.Property("VictimHeading") + .HasColumnType("float"); + + b.Property("VictimId") + .HasColumnType("int"); + + b.Property("VictimPositionX") + .HasColumnType("float"); + + b.Property("VictimPositionY") + .HasColumnType("float"); + + b.Property("VictimPositionZ") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("KillerId"); + + b.HasIndex("VictimId"); + + b.ToTable("DeathLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.News", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Caption") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Content") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Timestamp") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("News"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedBlip", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Alpha") + .HasColumnType("tinyint unsigned"); + + b.Property("Color") + .HasColumnType("tinyint unsigned"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("DrawDistance") + .HasColumnType("float"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Rotation") + .HasColumnType("float"); + + b.Property("Scale") + .HasColumnType("float"); + + b.Property("ShortRange") + .HasColumnType("tinyint(1)"); + + b.Property("Sprite") + .HasColumnType("smallint"); + + b.HasKey("Id"); + + b.ToTable("Blips"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedMarker", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("ColorA") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorB") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorG") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorR") + .HasColumnType("tinyint unsigned"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("DirectionX") + .HasColumnType("float"); + + b.Property("DirectionY") + .HasColumnType("float"); + + b.Property("DirectionZ") + .HasColumnType("float"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RotationX") + .HasColumnType("float"); + + b.Property("RotationY") + .HasColumnType("float"); + + b.Property("RotationZ") + .HasColumnType("float"); + + b.Property("Scale") + .HasColumnType("float"); + + b.Property("Type") + .HasColumnType("tinyint unsigned"); + + b.Property("Visible") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.ToTable("Markers"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedPed", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("HashModel") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Heading") + .HasColumnType("float"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Type") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Peds"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedPickup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("PositionX") + .HasColumnType("float") + .HasMaxLength(128); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RespawnTime") + .HasColumnType("int"); + + b.Property("RotationX") + .HasColumnType("float"); + + b.Property("RotationY") + .HasColumnType("float"); + + b.Property("RotationZ") + .HasColumnType("float"); + + b.Property("Vehicle") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.ToTable("Pickups"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedTextLabel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("ColorA") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorB") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorG") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorR") + .HasColumnType("tinyint unsigned"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("DrawDistance") + .HasColumnType("float"); + + b.Property("Font") + .HasColumnType("tinyint unsigned"); + + b.Property("LOS") + .HasColumnType("tinyint(1)"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Text") + .IsRequired() + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("TextLabels"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ServerVariable", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.Property("Variable") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("ServerVariables"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ServerVehicle", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(true); + + b.Property("Discriminator") + .IsRequired() + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("DistanceDriven") + .HasColumnType("float"); + + b.Property("Heading") + .HasColumnType("float"); + + b.Property("Livery") + .HasColumnType("int"); + + b.Property("Locked") + .HasColumnType("tinyint(1)"); + + b.Property("Model") + .HasColumnType("int unsigned"); + + b.Property("NumberPlate") + .HasColumnType("varchar(8) CHARACTER SET utf8mb4") + .HasMaxLength(8); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("PrimaryColor") + .HasColumnType("int"); + + b.Property("SecondaryColor") + .HasColumnType("int"); + + b.Property("TankAmount") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("ServerVehicles"); + + b.HasDiscriminator("Discriminator").HasValue("ServerVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopClothe", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Category") + .HasColumnType("int"); + + b.Property("ClotheId") + .HasColumnType("int"); + + b.Property("ComponentId") + .HasColumnType("int"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("TypeId") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("ShopClothes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("ShopId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("ShopItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.TuningGarage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("TuningGarages"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Turfs", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Color") + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("MaxValue") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Owner") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Range") + .HasColumnType("float"); + + b.Property("Rotation") + .HasColumnType("float"); + + b.Property("Surplus") + .HasColumnType("tinyint(1)"); + + b.Property("Value") + .HasColumnType("int"); + + b.Property("Vector") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Turfs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("AdminLevel") + .HasColumnType("int"); + + b.Property("BanId") + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("BusSkill") + .HasColumnType("int"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("Dead") + .HasColumnType("tinyint(1)"); + + b.Property("DriverLicenseBike") + .HasColumnType("tinyint(1)"); + + b.Property("DriverLicenseVehicle") + .HasColumnType("tinyint(1)"); + + b.Property("Email") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("FactionLeader") + .HasColumnType("tinyint(1)"); + + b.Property("FactionRankId") + .HasColumnType("int"); + + b.Property("FlyingLicensePlane") + .HasColumnType("tinyint(1)"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.Property("GroupRank") + .HasColumnType("int"); + + b.Property("Handmoney") + .HasColumnType("int"); + + b.Property("HouseId") + .HasColumnType("int"); + + b.Property("JailTime") + .HasColumnType("int"); + + b.Property("JobId") + .HasColumnType("int"); + + b.Property("LogUserId") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Password") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("PaydayTimer") + .HasColumnType("int"); + + b.Property("PilotSkill") + .HasColumnType("int"); + + b.Property("PlayedMinutes") + .HasColumnType("int"); + + b.Property("Points") + .HasColumnType("int"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RegistrationDate") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.Property("SocialClubName") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Wage") + .HasColumnType("int"); + + b.Property("Wanteds") + .HasColumnType("int"); + + b.Property("WeaponLicense") + .HasColumnType("tinyint(1)"); + + b.Property("failpoints") + .HasColumnType("int"); + + b.Property("otheramount") + .HasColumnType("int"); + + b.Property("trashcount") + .HasColumnType("int"); + + b.Property("warn") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("BanId"); + + b.HasIndex("BankAccountId"); + + b.HasIndex("BusinessId") + .IsUnique(); + + b.HasIndex("CharacterId"); + + b.HasIndex("FactionId"); + + b.HasIndex("FactionRankId"); + + b.HasIndex("GroupId"); + + b.HasIndex("HouseId"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("Bic") + .HasColumnType("varchar(12) CHARACTER SET utf8mb4") + .HasMaxLength(12); + + b.Property("Iban") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.HasKey("Id"); + + b.ToTable("UserBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("VehicleId"); + + b.ToTable("VehicleItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleMod", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ModId") + .HasColumnType("int"); + + b.Property("ServerVehicleId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ServerVehicleId", "Slot") + .IsUnique(); + + b.ToTable("VehicleMods"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Whitelist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("SocialClubName") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("WhitelistEntries"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("BuyPrice") + .HasColumnType("int"); + + b.Property("Owners") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.ToTable("FactionVehicles"); + + b.HasDiscriminator().HasValue("FactionVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.HasIndex("GroupId"); + + b.HasDiscriminator().HasValue("GroupVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.JobVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("JobId") + .HasColumnType("int"); + + b.HasDiscriminator().HasValue("JobVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.NoobSpawnVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("NoobSpawnVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.NoobVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("NoobVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("SavedVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.SchoolVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("SchoolId") + .HasColumnType("int"); + + b.HasDiscriminator().HasValue("SchoolVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.ToTable("ShopVehicles"); + + b.HasDiscriminator().HasValue("ShopVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("Price") + .HasColumnName("UserVehicle_Price") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasIndex("UserId"); + + b.ToTable("UserVehicles"); + + b.HasDiscriminator().HasValue("UserVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Ban", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoutePoint", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.BusRoute", "BusRoute") + .WithMany("RoutePoints") + .HasForeignKey("BusRouteId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Character", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.CharacterCloth", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Door", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.DutyCloth", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Faction", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.FactionBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionRank", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionWeapon", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Group", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.GroupBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.House", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.HouseBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseRental", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.House", "House") + .WithMany("Rentals") + .HasForeignKey("HouseId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Death", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "Killer") + .WithMany() + .HasForeignKey("KillerId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "Victim") + .WithMany() + .HasForeignKey("VictimId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.News", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.User", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Ban", "Ban") + .WithMany() + .HasForeignKey("BanId"); + + b.HasOne("ReallifeGamemode.Database.Entities.UserBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Character", "Character") + .WithMany() + .HasForeignKey("CharacterId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + + b.HasOne("ReallifeGamemode.Database.Entities.FactionRank", "FactionRank") + .WithMany() + .HasForeignKey("FactionRankId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") + .WithMany() + .HasForeignKey("GroupId"); + + b.HasOne("ReallifeGamemode.Database.Entities.House", "House") + .WithMany() + .HasForeignKey("HouseId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserItem", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleItem", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.ServerVehicle", "Vehicle") + .WithMany() + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleMod", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.ServerVehicle", "Vehicle") + .WithMany() + .HasForeignKey("ServerVehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupVehicle", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") + .WithMany() + .HasForeignKey("GroupId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserVehicle", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ReallifeGamemode.Database/Migrations/20210405190220_UserNameUniqueIndex.cs b/ReallifeGamemode.Database/Migrations/20210405190220_UserNameUniqueIndex.cs new file mode 100644 index 00000000..35e77a9a --- /dev/null +++ b/ReallifeGamemode.Database/Migrations/20210405190220_UserNameUniqueIndex.cs @@ -0,0 +1,23 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace ReallifeGamemode.Database.Migrations +{ + public partial class UserNameUniqueIndex : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateIndex( + name: "IX_Users_Name", + table: "Users", + column: "Name", + unique: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_Users_Name", + table: "Users"); + } + } +} diff --git a/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs b/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs index b502af3e..1a9d86a2 100644 --- a/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs +++ b/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs @@ -1463,6 +1463,9 @@ namespace ReallifeGamemode.Database.Migrations b.HasIndex("HouseId"); + b.HasIndex("Name") + .IsUnique(); + b.ToTable("Users"); }); diff --git a/ReallifeGamemode.Database/Models/DatabaseContext.cs b/ReallifeGamemode.Database/Models/DatabaseContext.cs index af7eca89..63a65d63 100644 --- a/ReallifeGamemode.Database/Models/DatabaseContext.cs +++ b/ReallifeGamemode.Database/Models/DatabaseContext.cs @@ -1,4 +1,6 @@ -using Microsoft.EntityFrameworkCore; +using System; +using System.Linq; +using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Logging; @@ -43,10 +45,16 @@ namespace ReallifeGamemode.Database.Models .HasIndex(b => b.BusinessId) .IsUnique(true); - modelBuilder.Entity() - .HasIndex(u => u.BusinessId) + modelBuilder.Entity(e => + { + e.HasIndex(u => u.BusinessId) .IsUnique(true); + e.HasIndex(u => u.Name) + .IsUnique(true); + }); + + modelBuilder.Entity() .Property(sv => sv.Active) .HasDefaultValue(true); From a95ed206cfab34a406d6c4d8970a17a2c975bdbb Mon Sep 17 00:00:00 2001 From: hydrant Date: Tue, 6 Apr 2021 20:33:26 +0200 Subject: [PATCH 063/116] ivehicle class --- ReallifeGamemode.Client/core/rage-mp/entities.ts | 7 +++++++ ReallifeGamemode.Client/game.ts | 1 + 2 files changed, 8 insertions(+) diff --git a/ReallifeGamemode.Client/core/rage-mp/entities.ts b/ReallifeGamemode.Client/core/rage-mp/entities.ts index 537c765e..9073acc4 100644 --- a/ReallifeGamemode.Client/core/rage-mp/entities.ts +++ b/ReallifeGamemode.Client/core/rage-mp/entities.ts @@ -249,6 +249,13 @@ class RageVehicle extends RageEntity implements IVehicle { this.vehicle.setDoorShut(door, instantly); } + + get class(): number { + if (mp.vehicles.exists(this.vehicle)) { + return this.vehicle.getClass(); + } + return -1; + } } diff --git a/ReallifeGamemode.Client/game.ts b/ReallifeGamemode.Client/game.ts index 84d9f67c..db02729b 100644 --- a/ReallifeGamemode.Client/game.ts +++ b/ReallifeGamemode.Client/game.ts @@ -69,6 +69,7 @@ interface IVehicle extends IEntity { setDoorsLocked(state: boolean); setDoorShut(door: number, instantly: boolean); setDoorOpen(door: number, loose: boolean, instantly: boolean); + class: number; } interface IEntityPool { From f0ca0306e5e319379df112828cb7f867e287a2a9 Mon Sep 17 00:00:00 2001 From: hydrant Date: Tue, 6 Apr 2021 20:33:51 +0200 Subject: [PATCH 064/116] smooth throttle reaktiviert --- ReallifeGamemode.Client/vehiclesync/smoothtrottle.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/vehiclesync/smoothtrottle.ts b/ReallifeGamemode.Client/vehiclesync/smoothtrottle.ts index fb57d81c..e11a060e 100644 --- a/ReallifeGamemode.Client/vehiclesync/smoothtrottle.ts +++ b/ReallifeGamemode.Client/vehiclesync/smoothtrottle.ts @@ -9,7 +9,7 @@ export default function smoothThrottle() { let GlobalDisable = false; - let DisableAntiReverse = true; + let DisableAntiReverse = false; let DisableSmoothThrottle = false; let BrakeSystem = false; @@ -47,7 +47,7 @@ export default function smoothThrottle() { return; if (BrakeSystem) { - if (mp.players.local.vehicle !== null) { + if (mp.players.local.vehicle && mp.vehicles.exists(mp.players.local.vehicle)) { if (!mp.players.local.vehicle.isSeatFree(-1)) //only do this if the vehicle has a driver (doesn't have to be the player who is rendering this) { //Optimize function calls to variables (probably doesn't make a difference) From b0180baff33237e141c00a1c4f0b163f7104d6b1 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Tue, 6 Apr 2021 20:43:11 +0200 Subject: [PATCH 065/116] Motor bei Flugzeugen geht nicht mehr aus --- ReallifeGamemode.Client/vehiclesync/vehiclesync.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts b/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts index 351b723e..f7989e42 100644 --- a/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts +++ b/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts @@ -16,9 +16,9 @@ game.events.onPlayerEnterVehicle(async (vehicle, seat) => { } if (vehicle) { - var data: VehicleData = vehicle.getSharedData("VehicleData"); - + var data: VehicleData = vehicle.getSharedData("VehicleData"); setVehicleData(vehicle, data); + if (vehicle.class == 16) mp.game.vehicle.defaultEngineBehaviour = true; } }); @@ -31,8 +31,8 @@ game.events.onPlayerExitVehicle(async () => { if (veh) { var data: VehicleData = veh.getSharedData("VehicleData"); - setVehicleData(veh, data); + if (veh.class == 16) mp.game.vehicle.defaultEngineBehaviour = false; } }); From be78edd912943f66fc4ce009c487175f992c6461 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 21:19:44 +0200 Subject: [PATCH 066/116] test --- ReallifeGamemode.Client/util/animationSync.ts | 18 +++++------ .../util/attachmentMngr.ts | 18 ++++++++--- ReallifeGamemode.Client/util/weapondamage.ts | 29 +++++++++++++++-- .../Commands/AdminCommands.cs | 1 - .../Util/AttachmentSync.cs | 31 +++++++++++++++---- 5 files changed, 73 insertions(+), 24 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index a2f604c8..d86a13d5 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -50,9 +50,14 @@ setInterval(() => { if (mp.players.local.getVariable("AnimationData")) { - blockInput = true; - } else { - blockInput = false; + let index = mp.game.joaat(mp.players.local.getVariable("AnimationData")); + let currentAnim = animationSyncData.animations[index]; + let { id, name, animDict, animName, duration, loop, flag } = currentAnim; + if (loop) { + blockInput = true; + } else { + blockInput = false; + } } mp.players.forEachInStreamRange( @@ -69,13 +74,6 @@ loadAnimDict(animDict, function () { mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) }); - } else if (!loop) { - let a = setInterval(function () { - if (player == mp.players.local) { - mp.events.callRemote("CLIENT:ClearAnimationData", player); - } - clearInterval(a); - }, duration); } }); }, 100); diff --git a/ReallifeGamemode.Client/util/attachmentMngr.ts b/ReallifeGamemode.Client/util/attachmentMngr.ts index b3f0a1d9..c1a3dcc2 100644 --- a/ReallifeGamemode.Client/util/attachmentMngr.ts +++ b/ReallifeGamemode.Client/util/attachmentMngr.ts @@ -1,6 +1,5 @@ import { IGame, IEntity } from "../game"; - export default function attachmentManager(game: IGame) { mp.events.add("SERVER:LoadAttachments", () => { attachmentMngr.register("char_creator_1", "prop_beggers_sign_04", 28422, new mp.Vector3(0, 0, 0), new mp.Vector3(0, 0, 0)); @@ -11,9 +10,7 @@ export default function attachmentManager(game: IGame) { attachmentMngr.register("weapondeal2", "w_sg_pumpshotgun", "chassis_dummy", new mp.Vector3(0.4, 1.6, 0.62), new mp.Vector3(90, 0, 180)); }); - - - const attachmentMngr = + const attachmentMngr = { attachments: {}, @@ -26,7 +23,7 @@ export default function attachmentManager(game: IGame) { let attInfo = this.attachments[id]; let object = mp.objects.new(attInfo.model, entity.position); - + object.__attMgrData = { targetEntity: entity.handle, bone: (typeof (attInfo.boneName) === 'string') ? entity.getBoneIndexByName(attInfo.boneName) : entity.getBoneIndex(attInfo.boneName), @@ -157,6 +154,17 @@ export default function attachmentManager(game: IGame) { } }); + mp.events.addDataHandler("attachToPlayer", (player: PlayerMp, attachedPlayer: PlayerMp) => { + if (!attachedPlayer) + return; + + let handle = player.handle; + if (player == mp.players.local) + handle = mp.players.local.handle; + + attachedPlayer.attachTo(handle, 0, 0, 1, 0, 0, 0, 0, false, true, false, true, 2, true); + }); + mp.events.addDataHandler("attachmentsData", (entity, data) => { let newAttachments = (data.length > 0) ? data.split('|').map(att => parseInt(att, 36)) : []; diff --git a/ReallifeGamemode.Client/util/weapondamage.ts b/ReallifeGamemode.Client/util/weapondamage.ts index 1635c09b..9f192070 100644 --- a/ReallifeGamemode.Client/util/weapondamage.ts +++ b/ReallifeGamemode.Client/util/weapondamage.ts @@ -1,4 +1,5 @@ export default function weapondamageUtil() { + let blockInput = false; mp.players.local.setSuffersCriticalHits(false); @@ -6,6 +7,13 @@ player.setSuffersCriticalHits(false); }); + mp.events.add("render", () => { + if (blockInput) { + mp.game.controls.disableControlAction(32, 142, true); + mp.game.controls.disableControlAction(32, 263, true); + } + }); + mp.events.add('SERVER:WeaponModifier', (player) => { //mp.gui.chat.push("Modifier steht jetzt auf" + modifier); //mp.players.local.setWeaponDamageModifier(modifier); @@ -16,65 +24,83 @@ case 0x1B06D571: //Pistol modifier = 0.4; meelemodifier = 1; - //mp.gui.chat.push("PistolModifier: " + modifier); + blockInput = true; break; case 0xBFE256D4: //Pistol_MK2 modifier = 0.4; meelemodifier = 1; + blockInput = true; break; case 0x5EF9FEC4: //Combatpistol modifier = 0.5; meelemodifier = 1; + blockInput = true; break; case 0x99AEEB3B: //Pistol50 modifier = 0.35; meelemodifier = 1; + blockInput = true; break; case 0x2BE6766B: //SMG modifier = 0.25; meelemodifier = 1; + blockInput = true; break; case 0x1D073A89: //Pumpshotgun modifier = 0.2; meelemodifier = 1; + blockInput = true; break; case 0x83BF0278: //Cabinerifle modifier = 0.2; meelemodifier = 1; + blockInput = true; break; case 0x624FE830: //Compactrifle modifier = 0.2; meelemodifier = 0.1; + blockInput = true; break; case 0x05FC3C11: //Sniperrifle modifier = 0.5; meelemodifier = 1; + blockInput = true; break; case 0xA2719263: //Meele Umarmed Fist meelemodifier = 0.1; modifier = 1; + blockInput = false; //mp.gui.chat.push("FistModifier: " + meelemodifier); break; case 0x958A4A8F: //Meele Baseball Bat meelemodifier = 0.15; modifier = 1; + blockInput = false; break; case 0x8BB05FD7: //Meele Flashlight meelemodifier = 0.1; modifier = 1; + blockInput = false; + break; case 0xD8DF3C3C: //Meele Knuckle meelemodifier = 0.1; modifier = 1; + blockInput = false; + //mp.gui.chat.push("KnuckleModifier: " + meelemodifier); break; case 0x678B81B1: //Meele Nightstick meelemodifier = 0.1; modifier = 1; + blockInput = false; + break; default: modifier = 1; meelemodifier = 1; + blockInput = false; + break; } mp.game.invoke("0xCE07B9F7817AADA3", player, modifier); @@ -95,7 +121,6 @@ } }); - /*mp.events.add('playerWeaponShot', (targetPosition, targetEntity) => { for (var x in this.weaponAmmo) { if (this.weaponAmmo[x].id != this.currentWeapon) { diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 652b72a3..6323b86a 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -47,7 +47,6 @@ namespace ReallifeGamemode.Server.Commands return; //target.SetInFrontOf(player); //target.Heading = player.Heading; - player.TriggerEvent("attach to Player", target); } [Command("cuff", "~m~Benutzung: ~s~/cuff [ID]")] diff --git a/ReallifeGamemode.Server/Util/AttachmentSync.cs b/ReallifeGamemode.Server/Util/AttachmentSync.cs index 822a5c76..51f02de9 100644 --- a/ReallifeGamemode.Server/Util/AttachmentSync.cs +++ b/ReallifeGamemode.Server/Util/AttachmentSync.cs @@ -1,5 +1,4 @@ - -using System; +using System; using System.Collections.Generic; using System.Linq; using GTANetworkAPI; @@ -12,7 +11,7 @@ public static class AttachmentSync /// The entity to attach the object to /// The attachment, should be in string or long type /// Pass true to remove the specified attachment, false otherwise. - + public static void AddAttachment(this Entity entity, dynamic attachment, bool remove) { if (!entity.HasData("Attachments")) @@ -109,6 +108,29 @@ public static class AttachmentSync { return string.Join('|', attachments.Select(a => Base36Extensions.ToBase36(a)).ToArray()); } + + public static void AttachPlayer(this Player player, Player attachTo) + { + attachTo.DetachPlayer(); + + if (!attachTo.HasData("attachedPlayer")) + attachTo.SetData("attachedPlayer", null); + + if (attachTo.GetData("attachedPlayer") == player) + return; + + attachTo.SetData("attachedPlayer", attachTo); + attachTo.SetSharedData("attachToPlayer", player); + } + + public static void DetachPlayer(this Player player) + { + if (!player.HasData("attachedPlayer")) + return; + + player.ResetData("attachedPlayer"); + player.ResetSharedData("attachToPlayer"); + } } public class AttachmentSyncExample : Script @@ -154,7 +176,4 @@ public class AttachmentSyncExample : Script player.ClearAttachments(); } } - - } - From 0390cb528e2c5ecaf3c98928b40b4b9e5ffa47f2 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 21:20:31 +0200 Subject: [PATCH 067/116] add to Command --- ReallifeGamemode.Server/Commands/AdminCommands.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 6323b86a..40a72c71 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -47,6 +47,7 @@ namespace ReallifeGamemode.Server.Commands return; //target.SetInFrontOf(player); //target.Heading = player.Heading; + target.AttachPlayer(player); } [Command("cuff", "~m~Benutzung: ~s~/cuff [ID]")] From 822af9c06b4d5d4aec23035fc8e4ecb98978326a Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 21:47:48 +0200 Subject: [PATCH 068/116] try cuff --- .../util/attachmentMngr.ts | 11 --------- .../Commands/AdminCommands.cs | 16 ------------- .../Util/AttachmentSync.cs | 23 ------------------- 3 files changed, 50 deletions(-) diff --git a/ReallifeGamemode.Client/util/attachmentMngr.ts b/ReallifeGamemode.Client/util/attachmentMngr.ts index c1a3dcc2..516cacb3 100644 --- a/ReallifeGamemode.Client/util/attachmentMngr.ts +++ b/ReallifeGamemode.Client/util/attachmentMngr.ts @@ -154,17 +154,6 @@ export default function attachmentManager(game: IGame) { } }); - mp.events.addDataHandler("attachToPlayer", (player: PlayerMp, attachedPlayer: PlayerMp) => { - if (!attachedPlayer) - return; - - let handle = player.handle; - if (player == mp.players.local) - handle = mp.players.local.handle; - - attachedPlayer.attachTo(handle, 0, 0, 1, 0, 0, 0, 0, false, true, false, true, 2, true); - }); - mp.events.addDataHandler("attachmentsData", (entity, data) => { let newAttachments = (data.length > 0) ? data.split('|').map(att => parseInt(att, 36)) : []; diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 40a72c71..95bcca64 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -34,22 +34,6 @@ namespace ReallifeGamemode.Server.Commands { #region Todo - [Command("test_cuff1")] - public void TestCuff1(Player player, string nameOrId) - { - if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) - { - ChatService.NotAuthorized(player); - return; - } - Player target = PlayerService.GetPlayerByNameOrId(nameOrId); - if (target.Id == player.Id) - return; - //target.SetInFrontOf(player); - //target.Heading = player.Heading; - target.AttachPlayer(player); - } - [Command("cuff", "~m~Benutzung: ~s~/cuff [ID]")] public void CmdCuffTest(Player player, string nameOrId) { diff --git a/ReallifeGamemode.Server/Util/AttachmentSync.cs b/ReallifeGamemode.Server/Util/AttachmentSync.cs index 51f02de9..ba9322ea 100644 --- a/ReallifeGamemode.Server/Util/AttachmentSync.cs +++ b/ReallifeGamemode.Server/Util/AttachmentSync.cs @@ -108,29 +108,6 @@ public static class AttachmentSync { return string.Join('|', attachments.Select(a => Base36Extensions.ToBase36(a)).ToArray()); } - - public static void AttachPlayer(this Player player, Player attachTo) - { - attachTo.DetachPlayer(); - - if (!attachTo.HasData("attachedPlayer")) - attachTo.SetData("attachedPlayer", null); - - if (attachTo.GetData("attachedPlayer") == player) - return; - - attachTo.SetData("attachedPlayer", attachTo); - attachTo.SetSharedData("attachToPlayer", player); - } - - public static void DetachPlayer(this Player player) - { - if (!player.HasData("attachedPlayer")) - return; - - player.ResetData("attachedPlayer"); - player.ResetSharedData("attachToPlayer"); - } } public class AttachmentSyncExample : Script From 0ea74f1b2082fd0df7cce07892dfdcd466784724 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 21:57:28 +0200 Subject: [PATCH 069/116] fix --- ReallifeGamemode.Server/Util/AnimationSync.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index 6d1b47c4..c53a5aba 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -20,6 +20,7 @@ namespace ReallifeGamemode.Server.Util return; player.SetSharedData("AnimationData", newAnimation); + player.SetData("Animation", newAnimation); } /// Check if Player has any Animation playing. @@ -35,7 +36,7 @@ namespace ReallifeGamemode.Server.Util /// Name of requested animation public static bool HasAnimation(this Player player, dynamic animationName) { - return player.HasData("Animation") && (player.GetData("AnimationData") == animationName); + return player.HasData("Animation") && (player.GetData("Animation") == animationName); } public static void ClearAnimation(this Player player) From 441a483c8ef997bfe4f12d29aa95b9c634a3d065 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 22:26:26 +0200 Subject: [PATCH 070/116] try AnimSync --- ReallifeGamemode.Client/util/animationSync.ts | 31 ++++++++++--------- .../Commands/AdminCommands.cs | 2 +- ReallifeGamemode.Server/Util/AnimationSync.cs | 19 ++++++++++-- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index d86a13d5..dad0d4c9 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -67,6 +67,8 @@ } let index = mp.game.joaat(player.getVariable("AnimationData")); + if (!animationSyncData.animations.hasOwnProperty(index)) return; + let currentAnim = animationSyncData.animations[index]; let { id, name, animDict, animName, duration, loop, flag } = currentAnim; @@ -78,6 +80,19 @@ }); }, 100); + mp.events.add("SERVER:QueueAnimations", (nextAnimations, currentAnimation) => { + let index = mp.game.joaat(currentAnimation); + if (!animationSyncData.animations.hasOwnProperty(index)) return; + let currentAnim = animationSyncData.animations[index]; + let { id, name, animDict, animName, duration, loop, flag } = currentAnim; + + let interval = setInterval(function () { + mp.events.callRemote("CLIENT:AnimPairTransition", nextAnimations); + + clearInterval(interval); + }, duration); + }); + mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => { entity.clearTasksImmediately(); if (string == null) { @@ -96,12 +111,9 @@ mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) }); - let pair = pairData.find(pair => pair.from == string); - if (!pair) - return; let a = setInterval(function () { if (entity == mp.players.local) { - mp.events.callRemote("CLIENT:AnimPairTransition", entity, pair.transitionTo); + mp.events.callRemote("CLIENT:ClearAnimationData", entity); } clearInterval(a); }, duration); @@ -126,15 +138,4 @@ mp.events.add("SERVER:SetInFrontPosition", (entity) => { mp.events.callRemote("CLIENT:SET_InFrontOfPos", entity.getOffsetFromInWorldCoords(0, 1, 0)); }); - - mp.events.add("attach to Player", (entity: PlayerMp) => { - entity.attachTo(mp.players.local.handle, 0, 0, 1, 0, 0, 0, 0, false, false, false, true, 2, true); - }); - - function xyInFrontOfPos(pos, heading, dist): Vector3Mp { - heading *= Math.PI / 180 - pos.x += (dist * Math.sin(-heading)) - pos.y += (dist * Math.cos(-heading)) - return pos; - } } \ No newline at end of file diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 95bcca64..fa836fa3 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -52,7 +52,7 @@ namespace ReallifeGamemode.Server.Commands if (!target.HasAnimation("Cuffed")) { player.SyncAnimation("doArrest"); - target.SyncAnimation("getArrest"); + target.SyncAnimation(new List() { "getArrest", "Cuffed" }); } else { diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index c53a5aba..3af3a0dd 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -8,11 +8,24 @@ namespace ReallifeGamemode.Server.Util { public static class AnimationSync { - public static void SyncAnimation(this Player player, dynamic animationName) + public static void SyncAnimation(this Player player, dynamic animations) { if (!player.HasData("Animation")) player.SetData("Animation", String.Empty); + string animationName; + + if (animations is List) + { + animationName = animations.get(0); + List nextAnimations = animations.Skip(1); + player.TriggerEvent("SERVER:QueueAnimations", nextAnimations.ToArray(), animationName); + } + else + { + animationName = animations; + } + string currentAnimation = player.GetData("Animation"); string newAnimation = animationName; @@ -52,9 +65,9 @@ namespace ReallifeGamemode.Server.Util public class AnimationSyncEvents : Script { [RemoteEvent("CLIENT:AnimPairTransition")] - public void AnimPairTransition(Player player, Player target, string transitionTo) + public void AnimPairTransition(Player player, string[] transitionTo) { - target.SyncAnimation(transitionTo); + player.SyncAnimation(transitionTo.ToList()); } [RemoteEvent("CLIENT:ClearAnimationData")] From 209817e6bd42160e7a3c5ee19366619ad67c2fbb Mon Sep 17 00:00:00 2001 From: Fabian Wessels Date: Tue, 6 Apr 2021 23:15:33 +0200 Subject: [PATCH 071/116] first backdoor draft --- ReallifeGamemode.Server/Managers/InteractionManager.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ReallifeGamemode.Server/Managers/InteractionManager.cs b/ReallifeGamemode.Server/Managers/InteractionManager.cs index 5557ee5e..5072f79c 100644 --- a/ReallifeGamemode.Server/Managers/InteractionManager.cs +++ b/ReallifeGamemode.Server/Managers/InteractionManager.cs @@ -809,6 +809,12 @@ namespace ReallifeGamemode.Server.Managers [RemoteEvent("CLIENT:InteractionMenu_CallService_Sani")] public void CallServiceSani(Player player) { + if (player.GetUser().FactionId == 2) + { + player.SendNotification("~r~[Fehler] ~w~Du kannst keinen Sanitäter rufen."); + return; + } + //MEDIC AUFTRAG MedicTask healTask = new MedicTask() { From 69cdee71980c96e59ba1dc828188b7e7e5ab98b8 Mon Sep 17 00:00:00 2001 From: Fabian Wessels Date: Tue, 6 Apr 2021 23:24:59 +0200 Subject: [PATCH 072/116] m und i druecken wenn man tot ist geht nicht mehr --- ReallifeGamemode.Server/Events/Key.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index b03b7da6..6d74b0e9 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -115,7 +115,8 @@ namespace ReallifeGamemode.Server.Events { using var dbContext = new DatabaseContext(); User u = player.GetUser(dbContext); - if (u == null) return; + if (u == null) return; + if (player.GetData("isDead")) return; var vehicles = dbContext.UserVehicles.Where(veh => veh.UserId == u.Id).OrderBy(veh => veh.Id).Select(v => new { @@ -607,6 +608,8 @@ namespace ReallifeGamemode.Server.Events public void KeyPressI(Player player) { if (!player.IsLoggedIn()) return; + if (player.GetData("isDead")) return; + player.TriggerEvent("inventoryShow"); InventoryManager.SetBackpackItems(player); } @@ -681,6 +684,7 @@ namespace ReallifeGamemode.Server.Events public void KeyPressO(Player player) { if (!player.IsLoggedIn()) return; + List players = NAPI.Pools.GetAllPlayers().Where(p => p.IsLoggedIn() == true).OrderBy(o => o.Handle.Value).ToList(); var listPlayers = players.Select(p => new From fcccaa8c51d4bc30bb8f911313c14673c2448a2d Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 23:35:02 +0200 Subject: [PATCH 073/116] fix --- ReallifeGamemode.Server/Util/AnimationSync.cs | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index 3af3a0dd..b1f2dbf7 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -8,24 +8,11 @@ namespace ReallifeGamemode.Server.Util { public static class AnimationSync { - public static void SyncAnimation(this Player player, dynamic animations) + public static void SyncAnimation(this Player player, dynamic animationName) { if (!player.HasData("Animation")) player.SetData("Animation", String.Empty); - string animationName; - - if (animations is List) - { - animationName = animations.get(0); - List nextAnimations = animations.Skip(1); - player.TriggerEvent("SERVER:QueueAnimations", nextAnimations.ToArray(), animationName); - } - else - { - animationName = animations; - } - string currentAnimation = player.GetData("Animation"); string newAnimation = animationName; @@ -36,6 +23,14 @@ namespace ReallifeGamemode.Server.Util player.SetData("Animation", newAnimation); } + public static void SyncAnimation(this Player player, List animations) + { + string animationName = animations.ElementAt(0); + List nextAnimations = animations.Skip(1).ToList(); + player.SyncAnimation(animationName); + player.TriggerEvent("SERVER:QueueAnimations", nextAnimations.ToArray(), animationName); + } + /// Check if Player has any Animation playing. /// /// From 6b73203860a8ab158f5bfea7250017210522d568 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 23:42:42 +0200 Subject: [PATCH 074/116] debug --- ReallifeGamemode.Server/Util/AnimationSync.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index b1f2dbf7..fc7c6b15 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -28,7 +28,9 @@ namespace ReallifeGamemode.Server.Util string animationName = animations.ElementAt(0); List nextAnimations = animations.Skip(1).ToList(); player.SyncAnimation(animationName); - player.TriggerEvent("SERVER:QueueAnimations", nextAnimations.ToArray(), animationName); + + if (nextAnimations.Count != 0) + player.TriggerEvent("SERVER:QueueAnimations", nextAnimations.ToArray(), animationName); } /// Check if Player has any Animation playing. @@ -62,6 +64,7 @@ namespace ReallifeGamemode.Server.Util [RemoteEvent("CLIENT:AnimPairTransition")] public void AnimPairTransition(Player player, string[] transitionTo) { + player.SendChatMessage(transitionTo.ToString()); player.SyncAnimation(transitionTo.ToList()); } From 9e77e5c75e3a6e2f5b15ff3f6e44b2615ef15feb Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 23:46:21 +0200 Subject: [PATCH 075/116] debug --- ReallifeGamemode.Client/util/animationSync.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index dad0d4c9..3305218c 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -87,6 +87,7 @@ let { id, name, animDict, animName, duration, loop, flag } = currentAnim; let interval = setInterval(function () { + mp.gui.chat.push(nextAnimations); mp.events.callRemote("CLIENT:AnimPairTransition", nextAnimations); clearInterval(interval); From ddc71b7d8e30e96affface56b4313e313b94c2b2 Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 6 Apr 2021 23:54:32 +0200 Subject: [PATCH 076/116] test --- ReallifeGamemode.Client/util/animationSync.ts | 6 +++--- ReallifeGamemode.Server/Util/AnimationSync.cs | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 3305218c..a56f8f6f 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -80,15 +80,15 @@ }); }, 100); - mp.events.add("SERVER:QueueAnimations", (nextAnimations, currentAnimation) => { + mp.events.add("SERVER:QueueAnimations", (JSON_nextAnimations, currentAnimation) => { let index = mp.game.joaat(currentAnimation); if (!animationSyncData.animations.hasOwnProperty(index)) return; let currentAnim = animationSyncData.animations[index]; let { id, name, animDict, animName, duration, loop, flag } = currentAnim; let interval = setInterval(function () { - mp.gui.chat.push(nextAnimations); - mp.events.callRemote("CLIENT:AnimPairTransition", nextAnimations); + mp.gui.chat.push(JSON_nextAnimations); + mp.events.callRemote("CLIENT:AnimPairTransition", JSON_nextAnimations); clearInterval(interval); }, duration); diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index fc7c6b15..e0a1ab89 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using GTANetworkAPI; +using Newtonsoft.Json; namespace ReallifeGamemode.Server.Util { @@ -62,8 +63,9 @@ namespace ReallifeGamemode.Server.Util public class AnimationSyncEvents : Script { [RemoteEvent("CLIENT:AnimPairTransition")] - public void AnimPairTransition(Player player, string[] transitionTo) + public void AnimPairTransition(Player player, string JSON_transitionTo) { + string[] transitionTo = (string[])JsonConvert.DeserializeObject(JSON_transitionTo); player.SendChatMessage(transitionTo.ToString()); player.SyncAnimation(transitionTo.ToList()); } From 50355cf81715e6e64f9c5ad7fa7245f5f472a51b Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 00:03:10 +0200 Subject: [PATCH 077/116] test --- ReallifeGamemode.Client/util/animationSync.ts | 5 ++--- ReallifeGamemode.Server/Util/AnimationSync.cs | 20 ++++++++++++++----- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index a56f8f6f..fdbe366b 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -80,15 +80,14 @@ }); }, 100); - mp.events.add("SERVER:QueueAnimations", (JSON_nextAnimations, currentAnimation) => { + mp.events.add("SERVER:QueueAnimations", (currentAnimation) => { let index = mp.game.joaat(currentAnimation); if (!animationSyncData.animations.hasOwnProperty(index)) return; let currentAnim = animationSyncData.animations[index]; let { id, name, animDict, animName, duration, loop, flag } = currentAnim; let interval = setInterval(function () { - mp.gui.chat.push(JSON_nextAnimations); - mp.events.callRemote("CLIENT:AnimPairTransition", JSON_nextAnimations); + mp.events.callRemote("CLIENT:AnimPairTransition"); clearInterval(interval); }, duration); diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index e0a1ab89..1b84b74b 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -9,6 +9,8 @@ namespace ReallifeGamemode.Server.Util { public static class AnimationSync { + public static Dictionary> animationPair = new Dictionary>(); + public static void SyncAnimation(this Player player, dynamic animationName) { if (!player.HasData("Animation")) @@ -28,10 +30,15 @@ namespace ReallifeGamemode.Server.Util { string animationName = animations.ElementAt(0); List nextAnimations = animations.Skip(1).ToList(); + player.SendChatMessage(nextAnimations.ToString()); + player.SyncAnimation(animationName); if (nextAnimations.Count != 0) - player.TriggerEvent("SERVER:QueueAnimations", nextAnimations.ToArray(), animationName); + { + player.TriggerEvent("SERVER:QueueAnimation", animationName); + animationPair.Add(player, nextAnimations); + } } /// Check if Player has any Animation playing. @@ -63,11 +70,14 @@ namespace ReallifeGamemode.Server.Util public class AnimationSyncEvents : Script { [RemoteEvent("CLIENT:AnimPairTransition")] - public void AnimPairTransition(Player player, string JSON_transitionTo) + public void AnimPairTransition(Player player) { - string[] transitionTo = (string[])JsonConvert.DeserializeObject(JSON_transitionTo); - player.SendChatMessage(transitionTo.ToString()); - player.SyncAnimation(transitionTo.ToList()); + if (!AnimationSync.animationPair.ContainsKey(player)) + return; + + List animationPairs = AnimationSync.animationPair[player]; + + player.SyncAnimation(animationPairs); } [RemoteEvent("CLIENT:ClearAnimationData")] From 45771e7aa0f58956b35a608f866e9aa1e4bf4857 Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 00:09:31 +0200 Subject: [PATCH 078/116] lol --- ReallifeGamemode.Client/util/animationSync.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index fdbe366b..13c3d2f4 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -9,11 +9,6 @@ animationSyncData.register("getUncuff", "mp_arresting", "b_uncuff", 5500, false, 0); }); - const pairData = [ - { from: "getArrest", transitionTo: "Cuffed" }, - - ]; - const animationSyncData = { animations: [], @@ -67,14 +62,13 @@ } let index = mp.game.joaat(player.getVariable("AnimationData")); - if (!animationSyncData.animations.hasOwnProperty(index)) return; let currentAnim = animationSyncData.animations[index]; let { id, name, animDict, animName, duration, loop, flag } = currentAnim; if (loop && !player.isPlayingAnim(animDict, animName, 3)) { loadAnimDict(animDict, function () { - mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) + mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); } }); @@ -108,7 +102,7 @@ let { id, name, animDict, animName, duration, loop, flag } = animData; loadAnimDict(animDict, function () { - mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); let a = setInterval(function () { From b8f695187789f015b70a73369349cf085505c0e6 Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 00:13:20 +0200 Subject: [PATCH 079/116] found it --- ReallifeGamemode.Client/util/animationSync.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 13c3d2f4..42371d75 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -105,12 +105,14 @@ mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) }); - let a = setInterval(function () { - if (entity == mp.players.local) { - mp.events.callRemote("CLIENT:ClearAnimationData", entity); - } - clearInterval(a); - }, duration); + if (!loop) { + let a = setInterval(function () { + if (entity == mp.players.local) { + mp.events.callRemote("CLIENT:ClearAnimationData", entity); + } + clearInterval(a); + }, duration); + } }); mp.events.add("render", () => { From 6b0977478610467a52add6f04bc6e58d2bbf093a Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 00:13:59 +0200 Subject: [PATCH 080/116] fix anim --- ReallifeGamemode.Client/util/animationSync.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 42371d75..70a20b7f 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -68,7 +68,7 @@ if (loop && !player.isPlayingAnim(animDict, animName, 3)) { loadAnimDict(animDict, function () { - mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) + mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) }); } }); @@ -102,7 +102,7 @@ let { id, name, animDict, animName, duration, loop, flag } = animData; loadAnimDict(animDict, function () { - mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 8, 1, duration, parseInt(flag), 0, !1, !1, !1) + mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) }); if (!loop) { From ae8d19646f932d543beea3597c1168416bc2061c Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 00:19:48 +0200 Subject: [PATCH 081/116] debug --- ReallifeGamemode.Server/Util/AnimationSync.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index 1b84b74b..0f1e5dd3 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -30,7 +30,7 @@ namespace ReallifeGamemode.Server.Util { string animationName = animations.ElementAt(0); List nextAnimations = animations.Skip(1).ToList(); - player.SendChatMessage(nextAnimations.ToString()); + nextAnimations.ForEach(s => player.SendChatMessage(s)); player.SyncAnimation(animationName); From e34cd3bd0175fd8a19c6b0d644dbd597179b7c72 Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 00:26:11 +0200 Subject: [PATCH 082/116] fix ? --- ReallifeGamemode.Client/util/animationSync.ts | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 70a20b7f..c38d5052 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -74,19 +74,6 @@ }); }, 100); - mp.events.add("SERVER:QueueAnimations", (currentAnimation) => { - let index = mp.game.joaat(currentAnimation); - if (!animationSyncData.animations.hasOwnProperty(index)) return; - let currentAnim = animationSyncData.animations[index]; - let { id, name, animDict, animName, duration, loop, flag } = currentAnim; - - let interval = setInterval(function () { - mp.events.callRemote("CLIENT:AnimPairTransition"); - - clearInterval(interval); - }, duration); - }); - mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => { entity.clearTasksImmediately(); if (string == null) { @@ -107,9 +94,9 @@ if (!loop) { let a = setInterval(function () { - if (entity == mp.players.local) { - mp.events.callRemote("CLIENT:ClearAnimationData", entity); - } + mp.events.callRemote("CLIENT:ClearAnimationData", entity); + mp.events.callRemote("CLIENT:AnimPairTransition"); + clearInterval(a); }, duration); } From 52bb80a70a07abebaa8e4fc635a7023da50de339 Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 01:08:22 +0200 Subject: [PATCH 083/116] Testserver push --- ReallifeGamemode.Client/Gui/nametags.ts | 11 ++-- ReallifeGamemode.Client/Player/keys.ts | 20 +++--- ReallifeGamemode.Client/util/animationSync.ts | 2 + .../Commands/UserCommands.cs | 16 ++--- ReallifeGamemode.Server/Events/Key.cs | 61 +++++++++++-------- .../Inventory/GroundItem.cs | 5 +- .../Managers/PositionManager.cs | 10 +-- ReallifeGamemode.Server/Util/AnimationSync.cs | 2 - .../Util/AttachmentSync.cs | 4 +- 9 files changed, 70 insertions(+), 61 deletions(-) diff --git a/ReallifeGamemode.Client/Gui/nametags.ts b/ReallifeGamemode.Client/Gui/nametags.ts index c780693d..7fee2fc4 100644 --- a/ReallifeGamemode.Client/Gui/nametags.ts +++ b/ReallifeGamemode.Client/Gui/nametags.ts @@ -1,7 +1,6 @@ import { IGame, IEntity } from "../game"; import game from ".."; - const maxDistance = 40 * 40; const width = 0.03; const height = 0.0065; @@ -27,9 +26,7 @@ const colors = [ { id: 9, color: [0, 166, 133, alpha] }, //news ]; - export default function customNametags() { - mp.nametags.enabled = false; mp.events.add('render', (nametags) => { @@ -67,19 +64,19 @@ export default function customNametags() { let y2 = y + 0.042; if (armour > 0) { - graphics.drawRect(x, y2, width + border * 2, height + border * 2, 0 , 0, 0, 200); - graphics.drawRect(x, y2, width, height, 150, 150, 150, 255); + graphics.drawRect(x, y2, width + border * 2, height + border * 2, 0, 0, 0, 200); + graphics.drawRect(x, y2, width, height, 50, 0, 0, 255); graphics.drawRect(x - width / 2 * (1 - health), y2, width * health, height, 200, 0, 0, 200); var x2 = x + width / 2 + border / 2; graphics.drawRect(x, y2 + height, width + border * 2, height + border * 2, 0, 0, 0, 200); - graphics.drawRect(x, y2 + height, width, height, 200, 200, 200, 255); + graphics.drawRect(x, y2 + height, width, height, 80, 80, 80, 255); graphics.drawRect(x - width / 2 * (1 - armour), y2 + height, width * armour, height, 255, 255, 255, 200); } else { graphics.drawRect(x, y2, width + border * 2, height + border * 2, 0, 0, 0, 200); - graphics.drawRect(x, y2, width, height, 150, 150, 150, 255); + graphics.drawRect(x, y2, width, height, 50, 0, 0, 255); graphics.drawRect(x - width / 2 * (1 - health), y2, width * health, height, 200, 0, 0, 200); } } diff --git a/ReallifeGamemode.Client/Player/keys.ts b/ReallifeGamemode.Client/Player/keys.ts index f4c11e13..1b9f4f92 100644 --- a/ReallifeGamemode.Client/Player/keys.ts +++ b/ReallifeGamemode.Client/Player/keys.ts @@ -6,11 +6,9 @@ //https://docs.microsoft.com/de-de/windows/desktop/inputdev/virtual-key-codes - const player = mp.players.local; export default function keys(globalData: IGlobalData) { - var showGui = true; //ENTER @@ -73,7 +71,6 @@ export default function keys(globalData: IGlobalData) { } }); - //I //Inventar mp.keys.bind(0x49, false, function () { if (!globalData.InChat && !globalData.InTuning) { @@ -83,9 +80,9 @@ export default function keys(globalData: IGlobalData) { //O //Spielerliste mp.keys.bind(0x4F, true, function () { - if (!globalData.InChat && !globalData.InTuning ) { + if (!globalData.InChat && !globalData.InTuning) { mp.events.callRemote("keyPress:O"); - //mp.events.call("showPlayerlist"); + //mp.events.call("showPlayerlist"); } }); @@ -113,7 +110,7 @@ export default function keys(globalData: IGlobalData) { //N //Motor Starten mp.keys.bind(0x4E, false, function () { if (!globalData.InChat) { - mp.events.callRemote("keyPress:N"); + mp.events.callRemote("keyPress:N"); } }); @@ -143,9 +140,16 @@ export default function keys(globalData: IGlobalData) { mp.gui.takeScreenshot(new Date().toLocaleDateString(), 1, 100, 80); }); + //H + mp.keys.bind(0x48, false, function () { + if (mp.keys.isDown(0x11)) { //CTRL + mp.events.call("keyPress:ControllH"); //hup + return; + } + }); + //F2 //Noclip mp.keys.bind(0x71, false, () => { - mp.events.callRemote("Noclip"); - + mp.events.callRemote("Noclip"); }); } \ No newline at end of file diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index c38d5052..6c435435 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -7,6 +7,8 @@ animationSyncData.register("getArrest", "mp_arrest_paired", "crook_p2_back_right", 3760, false, 0); animationSyncData.register("doUncuff", "mp_arresting", "a_uncuff", 5500, false, 0); animationSyncData.register("getUncuff", "mp_arresting", "b_uncuff", 5500, false, 0); + animationSyncData.register("hup", "mp_am_hold_up", "handsup_base", -1, true, 50); + animationSyncData.register("carryBox", "anim@heists@box_carry@", "idle", -1, true, 50); }); const animationSyncData = diff --git a/ReallifeGamemode.Server/Commands/UserCommands.cs b/ReallifeGamemode.Server/Commands/UserCommands.cs index 3804adc0..34a3312a 100644 --- a/ReallifeGamemode.Server/Commands/UserCommands.cs +++ b/ReallifeGamemode.Server/Commands/UserCommands.cs @@ -16,14 +16,12 @@ namespace ReallifeGamemode.Server.Commands { internal class UserCommands : Script { - [Command("skill")] public void CmdUserSkill(Player player) { User user = player.GetUser(new DatabaseContext()); player.SendChatMessage($"~c~BusSkill = {user.BusSkill}/800, PilotSkill = {user.PilotSkill}/300."); - } [Command("id", "~m~Benutzung: ~s~/id [Name]")] @@ -34,7 +32,8 @@ namespace ReallifeGamemode.Server.Commands if (target == null) { player.SendChatMessage("~c~Spieler ist nicht online."); - } else + } + else { player.SendChatMessage("~c~ID: (" + target.Id + ") " + target.Name); } @@ -90,6 +89,7 @@ namespace ReallifeGamemode.Server.Commands ChatService.SendMessage(player, "~m~" + ((VehicleHash)pVeh.Model) + " | Farbe 1: " + pVeh.PrimaryColor + " | Farbe 2: " + pVeh.SecondaryColor + " | ID: " + pVeh.Handle.Value); } } + [Command("help", "~m~Benutzung: ~s~/help")] public void CmdHelp(Player player) { @@ -106,8 +106,10 @@ namespace ReallifeGamemode.Server.Commands [Command("hup")] public void CmdAnim(Player player) { - player.StopAnimation(); - player.PlayAnimation("mp_am_hold_up", "handsup_base", (int)(AnimationFlags.Loop | AnimationFlags.OnlyAnimateUpperBody | AnimationFlags.AllowPlayerControl | AnimationFlags.Cancellable)); + if (player.HasAnimation()) + return; + + player.SyncAnimation("hup"); ChatService.SendInRange(player.Position, 20, $"~m~{player.Name} stellt sich..."); } @@ -119,9 +121,7 @@ namespace ReallifeGamemode.Server.Commands ChatService.NotAuthorized(player); return; } - ChatService.BroadcastFaction("~b~[Event] " + player.Name + ": " + msg, new List() { 9 }) ; - + ChatService.BroadcastFaction("~b~[Event] " + player.Name + ": " + msg, new List() { 9 }); } } } - diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 6d74b0e9..6e2ca5b5 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -30,6 +30,7 @@ namespace ReallifeGamemode.Server.Events public class Key : Script { #region User Key + [RemoteEvent("keyPress:NUM2")] public void KeyPressNUM2(Player player) { @@ -60,6 +61,7 @@ namespace ReallifeGamemode.Server.Events GroundItem.PickUpGroundItem(player); } + /* [RemoteEvent("keyPress:LEFT_ARROW")] public void KeyPressLeftArrow(Player player) @@ -85,6 +87,7 @@ namespace ReallifeGamemode.Server.Events } } */ + [RemoteEvent("keyPress:RIGHT_ARROW")] public void KeyPressRightArrow(Player player) { @@ -115,7 +118,7 @@ namespace ReallifeGamemode.Server.Events { using var dbContext = new DatabaseContext(); User u = player.GetUser(dbContext); - if (u == null) return; + if (u == null) return; if (player.GetData("isDead")) return; var vehicles = dbContext.UserVehicles.Where(veh => veh.UserId == u.Id).OrderBy(veh => veh.Id).Select(v => new @@ -169,7 +172,7 @@ namespace ReallifeGamemode.Server.Events int pay_amount = 0; bool house = false; - if(u.House != null) + if (u.House != null) { house = true; } @@ -185,7 +188,6 @@ namespace ReallifeGamemode.Server.Events } player.TriggerEvent("SERVER:InteractionMenu_OpenMenu", JsonConvert.SerializeObject(accountData), factionleader, faction, group, factionInvite, groupInvite, ticket_boolean, ticket_amount, pay_amount, house); - } [RemoteEvent("keyPress:E")] @@ -194,16 +196,15 @@ namespace ReallifeGamemode.Server.Events if (!player.IsLoggedIn()) return; var user = player.GetUser(); - if (player.HasData("nearATM")) { ATMManager.ShowAtmUi(player, player.GetData("nearATM")); return; } - if(!player.IsInVehicle) + if (!player.IsInVehicle) { - if(GroundItem.PickUpGroundItem(player)) + if (GroundItem.PickUpGroundItem(player)) { return; } @@ -217,7 +218,7 @@ namespace ReallifeGamemode.Server.Events FriseurPoint nearestFriseurPoint = PositionManager.friseurPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.5 && (!user.GetData("duty"))); ItemshopPoint nearestItemShopPoint = PositionManager.itemshopPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.5); JobPoint nearestJobPoint = PositionManager.JobPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.6); - + if (user?.FactionId != null) { BehindVehiclePoint nearestBehindVehiclePoint = MarkerBehinVehicle.behindVehiclePoints.Find(s => s.marker.Position.DistanceTo(player.Position) <= 3 && (user.FactionId == 8 || user.FactionId == 7 || user.FactionId == 1 || user.FactionId == 3)); @@ -229,7 +230,6 @@ namespace ReallifeGamemode.Server.Events List vehicleItems = dbContext.VehicleItems.ToList().Where(f => f.GetVehicle().GetVehicle() == nearestBehindVehiclePoint.vehicle && InventoryManager.GetItemById(f.ItemId) is IWeaponDealItem).ToList(); if (vehicleItems.Count == 0) { - GTANetworkAPI.Vehicle vehicle = nearestBehindVehiclePoint.vehicle; if (vehicle.HasAttachment("weapondeal")) @@ -367,7 +367,7 @@ namespace ReallifeGamemode.Server.Events if (player.HasAttachment("ammobox")) { player.AddAttachment("ammobox", true); - player.StopAnimation(); + player.ClearAnimation(); } bool unloadedWeaponPackage = false; @@ -430,13 +430,12 @@ namespace ReallifeGamemode.Server.Events if (user.FactionRank.Order >= weapon.Rank) specials.Add(weapon.WeaponModel.ToString()); break; + case 5: if (user.FactionRank.Order >= weapon.Rank) armor.Add(weapon.WeaponModel.ToString()); break; - } - } foreach (var weapon in weapons) { @@ -496,7 +495,7 @@ namespace ReallifeGamemode.Server.Events foreach (Player target in NAPI.Pools.GetAllPlayers()) { User c = target.GetUser(); - if(c == null) + if (c == null) { continue; } @@ -556,7 +555,7 @@ namespace ReallifeGamemode.Server.Events player.TriggerEvent("renderTextOnScreen", "Steige nun in eines der Fahrzeuge und starte den Motor mit der Taste 'N'."); return; } - } + } else if (nearestJobPoint.jobId == 3 && player.GetUser().JobId == 3) { if (nearestJobPoint.Skill < 300 && player.GetUser().PilotSkill >= 0) @@ -679,7 +678,6 @@ namespace ReallifeGamemode.Server.Events player.TriggerEvent("SERVER:Job_ShowJobMenu", job.Name, json); } - [RemoteEvent("keyPress:O")] public void KeyPressO(Player player) { @@ -688,13 +686,13 @@ namespace ReallifeGamemode.Server.Events List players = NAPI.Pools.GetAllPlayers().Where(p => p.IsLoggedIn() == true).OrderBy(o => o.Handle.Value).ToList(); var listPlayers = players.Select(p => new - { - Id = p.Handle.Value, - p.Name, - p.Ping, - FactionName = p.GetUser()?.Faction?.Name ?? "Zivilist", - }); - player.TriggerEvent("showPlayerlist", JsonConvert.SerializeObject(listPlayers)); + { + Id = p.Handle.Value, + p.Name, + p.Ping, + FactionName = p.GetUser()?.Faction?.Name ?? "Zivilist", + }); + player.TriggerEvent("showPlayerlist", JsonConvert.SerializeObject(listPlayers)); } [RemoteEvent("keyPress:K")] @@ -801,9 +799,9 @@ namespace ReallifeGamemode.Server.Events } else if (sV is FactionVehicle fV) { - if(fV.Model == VehicleHash.Burrito3 && u.FactionId == 1 - || fV.Model == VehicleHash.Burrito3 && u.FactionId == 3 - || fV.Model == VehicleHash.Burrito3 && u.FactionId == 7 + if (fV.Model == VehicleHash.Burrito3 && u.FactionId == 1 + || fV.Model == VehicleHash.Burrito3 && u.FactionId == 3 + || fV.Model == VehicleHash.Burrito3 && u.FactionId == 7 || fV.Model == VehicleHash.Burrito3 && u.FactionId == 8 || fV.Model == VehicleHash.Policet && u.FactionId == 1 || fV.Model == VehicleHash.Policet && u.FactionId == 3 @@ -967,8 +965,17 @@ namespace ReallifeGamemode.Server.Events player.TriggerEvent("ToggleVehicleMenu"); } } - #endregion - #region Faction Key - #endregion + + [RemoteEvent("keyPress:ControllH")] + public void KeyPressControllH(Player player) + { + if (player.HasAnimation()) + return; + + player.SyncAnimation("hup"); + ChatService.SendInRange(player.Position, 20, $"~m~{player.Name} stellt sich..."); + } + + #endregion User Key } } diff --git a/ReallifeGamemode.Server/Inventory/GroundItem.cs b/ReallifeGamemode.Server/Inventory/GroundItem.cs index 4c6ca743..0f059a5f 100644 --- a/ReallifeGamemode.Server/Inventory/GroundItem.cs +++ b/ReallifeGamemode.Server/Inventory/GroundItem.cs @@ -6,6 +6,7 @@ using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Extensions; using ReallifeGamemode.Server.Inventory.Interfaces; using ReallifeGamemode.Server.Managers; +using ReallifeGamemode.Server.Util; namespace ReallifeGamemode.Server.Inventory { @@ -99,9 +100,9 @@ namespace ReallifeGamemode.Server.Inventory } if (nearestItem is IWeaponDealItem obj) { - if (!player.HasAttachment("ammobox")) + if (!player.HasAttachment("ammobox") && !player.HasAnimation()) { - player.PlayAnimation("anim@heists@box_carry@", "idle", 49); + player.SyncAnimation("carryBox"); player.AddAttachment("ammobox", false); NAPI.Player.SetPlayerCurrentWeapon(player, WeaponHash.Unarmed); } diff --git a/ReallifeGamemode.Server/Managers/PositionManager.cs b/ReallifeGamemode.Server/Managers/PositionManager.cs index ab097f63..ebe2b755 100644 --- a/ReallifeGamemode.Server/Managers/PositionManager.cs +++ b/ReallifeGamemode.Server/Managers/PositionManager.cs @@ -4,6 +4,7 @@ using GTANetworkAPI; using ReallifeGamemode.Server.Shop.Clothing; using ReallifeGamemode.Server.Shop.SevenEleven; using ReallifeGamemode.Server.Shop.Friseur; +using ReallifeGamemode.Server.Util; namespace ReallifeGamemode.Server.Managers { @@ -18,8 +19,8 @@ namespace ReallifeGamemode.Server.Managers public static List ElevatorPoints = new List(); public static List clotheshopPoints = new List(); - - public static List friseurPoints = new List(); + + public static List friseurPoints = new List(); public static List itemshopPoints = new List(); @@ -213,6 +214,7 @@ namespace ReallifeGamemode.Server.Managers NAPI.Blip.CreateBlip(513, p.Position, 1f, 16, "Busfahrer", 255, 0, true); } } + #endregion JobPoints #region Shops @@ -285,7 +287,6 @@ namespace ReallifeGamemode.Server.Managers return; } - player.Position = ElevatorPoints.Where(e => e.Stage == level).First().Position; } } @@ -347,7 +348,7 @@ public class BehindVehiclePoint { if (!player.HasAttachment("ammobox")) { - player.PlayAnimation("anim@heists@box_carry@", "idle", 49); + player.SyncAnimation("carryBox"); player.AddAttachment("ammobox", false); NAPI.Player.SetPlayerCurrentWeapon(player, WeaponHash.Unarmed); } @@ -389,7 +390,6 @@ public class JobPoint public Vector3 Position { get; set; } public int jobId { get; set; } public int Skill { get; set; } - } public class ElevatorPoint diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index 0f1e5dd3..7903c127 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -30,8 +30,6 @@ namespace ReallifeGamemode.Server.Util { string animationName = animations.ElementAt(0); List nextAnimations = animations.Skip(1).ToList(); - nextAnimations.ForEach(s => player.SendChatMessage(s)); - player.SyncAnimation(animationName); if (nextAnimations.Count != 0) diff --git a/ReallifeGamemode.Server/Util/AttachmentSync.cs b/ReallifeGamemode.Server/Util/AttachmentSync.cs index ba9322ea..04e1db94 100644 --- a/ReallifeGamemode.Server/Util/AttachmentSync.cs +++ b/ReallifeGamemode.Server/Util/AttachmentSync.cs @@ -142,13 +142,13 @@ public class AttachmentSyncExample : Script if (!player.HasAttachment("ammobox")) { player.AddAttachment("ammobox", false); - player.PlayAnimation("anim@heists@box_carry@", "idle", 49); + //player.SyncAnimation("carryBox"); //veh.AddAttachment("weapondeal1", false); //veh.AddAttachment("weapondeal2", false); } else { - player.StopAnimation(); + player.ClearAnimation(); player.ClearAttachments(); } From e391f86609d59406622fdb9736911b677c7b609b Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 01:12:22 +0200 Subject: [PATCH 084/116] testServer --- ReallifeGamemode.Client/util/animationSync.ts | 2 +- ReallifeGamemode.Server/Commands/UserCommands.cs | 1 + ReallifeGamemode.Server/Events/Key.cs | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 6c435435..fd7e6c32 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -7,7 +7,7 @@ animationSyncData.register("getArrest", "mp_arrest_paired", "crook_p2_back_right", 3760, false, 0); animationSyncData.register("doUncuff", "mp_arresting", "a_uncuff", 5500, false, 0); animationSyncData.register("getUncuff", "mp_arresting", "b_uncuff", 5500, false, 0); - animationSyncData.register("hup", "mp_am_hold_up", "handsup_base", -1, true, 50); + animationSyncData.register("hup", "mp_am_hold_up", "handsup_base", -1, true, 146); animationSyncData.register("carryBox", "anim@heists@box_carry@", "idle", -1, true, 50); }); diff --git a/ReallifeGamemode.Server/Commands/UserCommands.cs b/ReallifeGamemode.Server/Commands/UserCommands.cs index 34a3312a..982b6082 100644 --- a/ReallifeGamemode.Server/Commands/UserCommands.cs +++ b/ReallifeGamemode.Server/Commands/UserCommands.cs @@ -106,6 +106,7 @@ namespace ReallifeGamemode.Server.Commands [Command("hup")] public void CmdAnim(Player player) { + if (player.HasAnimation("hup")) { player.StopAnimation(); } if (player.HasAnimation()) return; diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 6e2ca5b5..86d921e0 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -969,6 +969,7 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("keyPress:ControllH")] public void KeyPressControllH(Player player) { + if (player.HasAnimation("hup")) { player.StopAnimation(); } if (player.HasAnimation()) return; From a9341366c14ab53f537d88cfd55d04ee1b9c9b6d Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 01:15:46 +0200 Subject: [PATCH 085/116] fix --- ReallifeGamemode.Server/Util/AttachmentSync.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/ReallifeGamemode.Server/Util/AttachmentSync.cs b/ReallifeGamemode.Server/Util/AttachmentSync.cs index 04e1db94..5828917a 100644 --- a/ReallifeGamemode.Server/Util/AttachmentSync.cs +++ b/ReallifeGamemode.Server/Util/AttachmentSync.cs @@ -148,8 +148,6 @@ public class AttachmentSyncExample : Script } else { - player.ClearAnimation(); - player.ClearAttachments(); } } From a4e7be7131f10db4750592fa36230dcb44ebd2d5 Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 01:20:31 +0200 Subject: [PATCH 086/116] fix --- ReallifeGamemode.Client/Player/keys.ts | 7 +++---- ReallifeGamemode.Client/util/animationSync.ts | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/ReallifeGamemode.Client/Player/keys.ts b/ReallifeGamemode.Client/Player/keys.ts index 1b9f4f92..48e2a4ab 100644 --- a/ReallifeGamemode.Client/Player/keys.ts +++ b/ReallifeGamemode.Client/Player/keys.ts @@ -140,13 +140,12 @@ export default function keys(globalData: IGlobalData) { mp.gui.takeScreenshot(new Date().toLocaleDateString(), 1, 100, 80); }); - //H - mp.keys.bind(0x48, false, function () { - if (mp.keys.isDown(0x11)) { //CTRL + setInterval(() => { + if (mp.keys.isDown(0x11) && mp.keys.isDown(0x48)) { //CTRL + H mp.events.call("keyPress:ControllH"); //hup return; } - }); + }, 100); //F2 //Noclip mp.keys.bind(0x71, false, () => { diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index fd7e6c32..6c435435 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -7,7 +7,7 @@ animationSyncData.register("getArrest", "mp_arrest_paired", "crook_p2_back_right", 3760, false, 0); animationSyncData.register("doUncuff", "mp_arresting", "a_uncuff", 5500, false, 0); animationSyncData.register("getUncuff", "mp_arresting", "b_uncuff", 5500, false, 0); - animationSyncData.register("hup", "mp_am_hold_up", "handsup_base", -1, true, 146); + animationSyncData.register("hup", "mp_am_hold_up", "handsup_base", -1, true, 50); animationSyncData.register("carryBox", "anim@heists@box_carry@", "idle", -1, true, 50); }); From 5676b741d14584a1fdea614683257f851a28be01 Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 01:24:23 +0200 Subject: [PATCH 087/116] fix --- ReallifeGamemode.Client/Player/keys.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/Player/keys.ts b/ReallifeGamemode.Client/Player/keys.ts index 48e2a4ab..50aaad52 100644 --- a/ReallifeGamemode.Client/Player/keys.ts +++ b/ReallifeGamemode.Client/Player/keys.ts @@ -141,7 +141,7 @@ export default function keys(globalData: IGlobalData) { }); setInterval(() => { - if (mp.keys.isDown(0x11) && mp.keys.isDown(0x48)) { //CTRL + H + if (mp.keys.isDown(17) && mp.keys.isDown(72)) { //CTRL + H mp.events.call("keyPress:ControllH"); //hup return; } From e4d6ebb1f23ee717deef283649edadfcb26c7f80 Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 01:24:57 +0200 Subject: [PATCH 088/116] fix --- ReallifeGamemode.Server/Commands/UserCommands.cs | 2 +- ReallifeGamemode.Server/Events/Key.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Server/Commands/UserCommands.cs b/ReallifeGamemode.Server/Commands/UserCommands.cs index 982b6082..e677e0c5 100644 --- a/ReallifeGamemode.Server/Commands/UserCommands.cs +++ b/ReallifeGamemode.Server/Commands/UserCommands.cs @@ -106,7 +106,7 @@ namespace ReallifeGamemode.Server.Commands [Command("hup")] public void CmdAnim(Player player) { - if (player.HasAnimation("hup")) { player.StopAnimation(); } + if (player.HasAnimation("hup")) { player.ClearAnimation(); } if (player.HasAnimation()) return; diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 86d921e0..3d833357 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -969,7 +969,7 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("keyPress:ControllH")] public void KeyPressControllH(Player player) { - if (player.HasAnimation("hup")) { player.StopAnimation(); } + if (player.HasAnimation("hup")) { player.ClearAnimation(); } if (player.HasAnimation()) return; From 4ef97cff7cc5e97ec34c8f51973fc7c4ed34fc00 Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 01:51:15 +0200 Subject: [PATCH 089/116] test --- ReallifeGamemode.Client/Player/keys.ts | 13 ++++++------- ReallifeGamemode.Client/package-lock.json | 5 +++++ ReallifeGamemode.Client/package.json | 3 +++ ReallifeGamemode.Server/Commands/UserCommands.cs | 2 +- ReallifeGamemode.Server/Events/Key.cs | 2 +- 5 files changed, 16 insertions(+), 9 deletions(-) diff --git a/ReallifeGamemode.Client/Player/keys.ts b/ReallifeGamemode.Client/Player/keys.ts index 50aaad52..96930636 100644 --- a/ReallifeGamemode.Client/Player/keys.ts +++ b/ReallifeGamemode.Client/Player/keys.ts @@ -6,7 +6,8 @@ //https://docs.microsoft.com/de-de/windows/desktop/inputdev/virtual-key-codes -const player = mp.players.local; +import { Key } from '../game'; +import BetterBindings from 'ragemp-better-bindings'; export default function keys(globalData: IGlobalData) { var showGui = true; @@ -140,12 +141,10 @@ export default function keys(globalData: IGlobalData) { mp.gui.takeScreenshot(new Date().toLocaleDateString(), 1, 100, 80); }); - setInterval(() => { - if (mp.keys.isDown(17) && mp.keys.isDown(72)) { //CTRL + H - mp.events.call("keyPress:ControllH"); //hup - return; - } - }, 100); + BetterBindings.bind('ctrl + g', () => { + mp.events.call("keyPress:ControllH"); //hup + return; + }); //F2 //Noclip mp.keys.bind(0x71, false, () => { diff --git a/ReallifeGamemode.Client/package-lock.json b/ReallifeGamemode.Client/package-lock.json index e523848f..fae2ae51 100644 --- a/ReallifeGamemode.Client/package-lock.json +++ b/ReallifeGamemode.Client/package-lock.json @@ -2879,6 +2879,11 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, + "ragemp-better-bindings": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ragemp-better-bindings/-/ragemp-better-bindings-1.0.4.tgz", + "integrity": "sha512-mev0UT74EmBen1rdg8FP9bKFsxUtDH56X2SM2JQQsWWzCzVvRP0HIt1Wqn1DuomszgSt/uzxZaufwCFbeOU+/Q==" + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", diff --git a/ReallifeGamemode.Client/package.json b/ReallifeGamemode.Client/package.json index 0c0b26ac..501e5304 100644 --- a/ReallifeGamemode.Client/package.json +++ b/ReallifeGamemode.Client/package.json @@ -22,5 +22,8 @@ "ProjectOpened": [ "watch" ] + }, + "dependencies": { + "ragemp-better-bindings": "^1.0.4" } } diff --git a/ReallifeGamemode.Server/Commands/UserCommands.cs b/ReallifeGamemode.Server/Commands/UserCommands.cs index e677e0c5..227e80ab 100644 --- a/ReallifeGamemode.Server/Commands/UserCommands.cs +++ b/ReallifeGamemode.Server/Commands/UserCommands.cs @@ -106,7 +106,7 @@ namespace ReallifeGamemode.Server.Commands [Command("hup")] public void CmdAnim(Player player) { - if (player.HasAnimation("hup")) { player.ClearAnimation(); } + if (player.HasAnimation("hup")) { player.ClearAnimation(); return; } if (player.HasAnimation()) return; diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 3d833357..b206f518 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -969,7 +969,7 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("keyPress:ControllH")] public void KeyPressControllH(Player player) { - if (player.HasAnimation("hup")) { player.ClearAnimation(); } + if (player.HasAnimation("hup")) { player.ClearAnimation(); return; } if (player.HasAnimation()) return; From c05cf4425e829014e0fc8bc8749c1b746543755a Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 01:54:16 +0200 Subject: [PATCH 090/116] fix --- ReallifeGamemode.Client/Player/keys.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/Player/keys.ts b/ReallifeGamemode.Client/Player/keys.ts index 96930636..725567f5 100644 --- a/ReallifeGamemode.Client/Player/keys.ts +++ b/ReallifeGamemode.Client/Player/keys.ts @@ -141,7 +141,7 @@ export default function keys(globalData: IGlobalData) { mp.gui.takeScreenshot(new Date().toLocaleDateString(), 1, 100, 80); }); - BetterBindings.bind('ctrl + g', () => { + BetterBindings.bind('ctrl+h', () => { mp.events.call("keyPress:ControllH"); //hup return; }); From 7ca9dd909cde20c3713b18e86ba712b296d147b5 Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 02:06:22 +0200 Subject: [PATCH 091/116] test --- ReallifeGamemode.Client/Player/keys.ts | 13 +++++++++++-- ReallifeGamemode.Client/util/attachmentMngr.ts | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/Player/keys.ts b/ReallifeGamemode.Client/Player/keys.ts index 725567f5..596f2b8f 100644 --- a/ReallifeGamemode.Client/Player/keys.ts +++ b/ReallifeGamemode.Client/Player/keys.ts @@ -7,7 +7,7 @@ //https://docs.microsoft.com/de-de/windows/desktop/inputdev/virtual-key-codes import { Key } from '../game'; -import BetterBindings from 'ragemp-better-bindings'; +import KeyBinder from 'ragemp-better-bindings'; export default function keys(globalData: IGlobalData) { var showGui = true; @@ -141,7 +141,16 @@ export default function keys(globalData: IGlobalData) { mp.gui.takeScreenshot(new Date().toLocaleDateString(), 1, 100, 80); }); - BetterBindings.bind('ctrl+h', () => { + KeyBinder.bind("alt+h", () => { + mp.events.call("keyPress:ControllH"); //hup + return; + }); + + KeyBinder.bind("ctrl+h", () => { + mp.events.call("keyPress:ControllH"); //hup + return; + }); + KeyBinder.bind("h", () => { mp.events.call("keyPress:ControllH"); //hup return; }); diff --git a/ReallifeGamemode.Client/util/attachmentMngr.ts b/ReallifeGamemode.Client/util/attachmentMngr.ts index 516cacb3..ec5bc2bb 100644 --- a/ReallifeGamemode.Client/util/attachmentMngr.ts +++ b/ReallifeGamemode.Client/util/attachmentMngr.ts @@ -8,6 +8,7 @@ export default function attachmentManager(game: IGame) { attachmentMngr.register("weapondeal", "ex_prop_crate_ammo_bc", "chassis_dummy", new mp.Vector3(0.08, -0.9, -0.2), new mp.Vector3(0, 0, 0)); attachmentMngr.register("weapondeal1", "ex_office_swag_guns02", "chassis_dummy", new mp.Vector3(0, 0.8, 0), new mp.Vector3(0, 0, 0)); attachmentMngr.register("weapondeal2", "w_sg_pumpshotgun", "chassis_dummy", new mp.Vector3(0.4, 1.6, 0.62), new mp.Vector3(90, 0, 180)); + attachmentMngr.register("handcuffs", "p_cs_cuffs_02_s", 28422, new mp.Vector3(0, 0, 0), new mp.Vector3(0, 0, 0)); }); const attachmentMngr = From d98c742c5942ba2424165a51cf3476cfed871411 Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 02:12:51 +0200 Subject: [PATCH 092/116] test --- ReallifeGamemode.Client/Player/keys.ts | 11 +---------- ReallifeGamemode.Client/util/animationSync.ts | 2 ++ ReallifeGamemode.Server/Events/Key.cs | 4 +++- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/ReallifeGamemode.Client/Player/keys.ts b/ReallifeGamemode.Client/Player/keys.ts index 596f2b8f..9c344a16 100644 --- a/ReallifeGamemode.Client/Player/keys.ts +++ b/ReallifeGamemode.Client/Player/keys.ts @@ -141,17 +141,8 @@ export default function keys(globalData: IGlobalData) { mp.gui.takeScreenshot(new Date().toLocaleDateString(), 1, 100, 80); }); - KeyBinder.bind("alt+h", () => { - mp.events.call("keyPress:ControllH"); //hup - return; - }); - KeyBinder.bind("ctrl+h", () => { - mp.events.call("keyPress:ControllH"); //hup - return; - }); - KeyBinder.bind("h", () => { - mp.events.call("keyPress:ControllH"); //hup + mp.events.callRemote("keyPress:ControllH"); //hup return; }); diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 6c435435..53abce1f 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -79,6 +79,8 @@ mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => { entity.clearTasksImmediately(); if (string == null) { + blockInput = false; + return; } diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index b206f518..47807d69 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -969,10 +969,12 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("keyPress:ControllH")] public void KeyPressControllH(Player player) { - if (player.HasAnimation("hup")) { player.ClearAnimation(); return; } + if (player.HasAnimation("hup")) { player.ClearAnimation(); player.AddAttachment("handcuffs", true); return; } if (player.HasAnimation()) return; + player.AddAttachment("handcuffs", false); + player.SyncAnimation("hup"); ChatService.SendInRange(player.Position, 20, $"~m~{player.Name} stellt sich..."); } From 5cea81de72057d6c64fa391d3a14b1205843c53d Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 03:17:02 +0200 Subject: [PATCH 093/116] Finish Cuff using AnimationSync + Added Command /cuff for LSPD and FIB (Wanteds can also be cuffed using the Interaction key). + Added Command /syncanim for Supporter * Player can now use CTRL + H to hup (/hup still usable) * Cuffs break after two minutes. TODO: - Players in Animation cannot enter Vehicle as driver neither can drive them. - Cuffed players will not loose their cuffs after reconnect. --- ReallifeGamemode.Client/util/animationSync.ts | 7 ++ .../util/attachmentMngr.ts | 2 +- ReallifeGamemode.Client/util/weapondamage.ts | 1 + .../Commands/AdminCommands.cs | 27 ------- .../Commands/FactionCommands.cs | 75 +++++++++++++------ .../Commands/UserCommands.cs | 1 - ReallifeGamemode.Server/Events/Key.cs | 32 +++++++- .../Extensions/ClientExtension.cs | 5 ++ .../Managers/PositionManager.cs | 2 + 9 files changed, 97 insertions(+), 55 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 53abce1f..f0e36c15 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -96,6 +96,13 @@ mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) }); + let b = setInterval(function () { + mp.events.callRemote("CLIENT:ClearAnimationData", entity); + if (name == "Cuffed" || name == "cuffed") + mp.events.call("renderTextOnScreen", "Handschellen gebrochen."); + clearInterval(b); + }, 120000); + if (!loop) { let a = setInterval(function () { mp.events.callRemote("CLIENT:ClearAnimationData", entity); diff --git a/ReallifeGamemode.Client/util/attachmentMngr.ts b/ReallifeGamemode.Client/util/attachmentMngr.ts index ec5bc2bb..a19df0ba 100644 --- a/ReallifeGamemode.Client/util/attachmentMngr.ts +++ b/ReallifeGamemode.Client/util/attachmentMngr.ts @@ -8,7 +8,7 @@ export default function attachmentManager(game: IGame) { attachmentMngr.register("weapondeal", "ex_prop_crate_ammo_bc", "chassis_dummy", new mp.Vector3(0.08, -0.9, -0.2), new mp.Vector3(0, 0, 0)); attachmentMngr.register("weapondeal1", "ex_office_swag_guns02", "chassis_dummy", new mp.Vector3(0, 0.8, 0), new mp.Vector3(0, 0, 0)); attachmentMngr.register("weapondeal2", "w_sg_pumpshotgun", "chassis_dummy", new mp.Vector3(0.4, 1.6, 0.62), new mp.Vector3(90, 0, 180)); - attachmentMngr.register("handcuffs", "p_cs_cuffs_02_s", 28422, new mp.Vector3(0, 0, 0), new mp.Vector3(0, 0, 0)); + attachmentMngr.register("handcuffs", "p_cs_cuffs_02_s", 28422, new mp.Vector3(0, 0, 0), new mp.Vector3(0, 90, 0)); }); const attachmentMngr = diff --git a/ReallifeGamemode.Client/util/weapondamage.ts b/ReallifeGamemode.Client/util/weapondamage.ts index 9f192070..eae20da7 100644 --- a/ReallifeGamemode.Client/util/weapondamage.ts +++ b/ReallifeGamemode.Client/util/weapondamage.ts @@ -10,6 +10,7 @@ mp.events.add("render", () => { if (blockInput) { mp.game.controls.disableControlAction(32, 142, true); + mp.game.controls.disableControlAction(32, 140, true); mp.game.controls.disableControlAction(32, 263, true); } }); diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index fa836fa3..e4ae58b3 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -34,33 +34,6 @@ namespace ReallifeGamemode.Server.Commands { #region Todo - [Command("cuff", "~m~Benutzung: ~s~/cuff [ID]")] - public void CmdCuffTest(Player player, string nameOrId) - { - if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) - { - ChatService.NotAuthorized(player); - return; - } - Player target = PlayerService.GetPlayerByNameOrId(nameOrId); - if (target.Id == player.Id) - return; - - target.SetInFrontOf(player); - target.Heading = player.Heading; - - if (!target.HasAnimation("Cuffed")) - { - player.SyncAnimation("doArrest"); - target.SyncAnimation(new List() { "getArrest", "Cuffed" }); - } - else - { - player.SyncAnimation("doUncuff"); - target.SyncAnimation("getUncuff"); - } - } - [Command("syncanim", "~m~Benutzung: ~s~/syncanim [animName]")] public void CmdSyncAnim(Player player, string animName = null) { diff --git a/ReallifeGamemode.Server/Commands/FactionCommands.cs b/ReallifeGamemode.Server/Commands/FactionCommands.cs index ac032bbb..da4d3316 100644 --- a/ReallifeGamemode.Server/Commands/FactionCommands.cs +++ b/ReallifeGamemode.Server/Commands/FactionCommands.cs @@ -11,6 +11,7 @@ using ReallifeGamemode.Server.Factions.Medic; using ReallifeGamemode.Server.Managers; using ReallifeGamemode.Server.Services; using ReallifeGamemode.Server.Types; +using ReallifeGamemode.Server.Util; using ReallifeGamemode.Services; /** @@ -57,7 +58,7 @@ namespace ReallifeGamemode.Server.Commands string rank = string.Empty; - if(f?.Name == "Ballas" || f?.Name == "Grove") + if (f?.Name == "Ballas" || f?.Name == "Grove") { rank = player.GetUser().GetFactionRank().RankName; } @@ -109,7 +110,7 @@ namespace ReallifeGamemode.Server.Commands string factionName = string.Empty; - if(f?.StateOwned ?? false) + if (f?.StateOwned ?? false) { factionName = u.GetFactionRank().RankName; } @@ -127,7 +128,6 @@ namespace ReallifeGamemode.Server.Commands #endregion Chat Commands - #region NewsReporter commands [Command("news", "~m~Benutzung: ~s~/news [Nachricht]", GreedyArg = true)] @@ -139,12 +139,12 @@ namespace ReallifeGamemode.Server.Commands ChatService.NotAuthorized(player); return; } - if (player.GetUser().Faction.Id == 9 ) + if (player.GetUser().Faction.Id == 9) { message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); string broadcastMessage = "!{ff9531}** News Reporter" + " " + player.Name + ": " + message + " **"; - ChatService.Broadcast(broadcastMessage); + ChatService.Broadcast(broadcastMessage); } else { @@ -152,11 +152,8 @@ namespace ReallifeGamemode.Server.Commands } } - - - - #endregion NewsReporter commands + #region Leader Commands [Command("giverank", "~m~Benutzung: ~s~/giverank [Name] [Rang]", GreedyArg = true)] @@ -212,7 +209,7 @@ namespace ReallifeGamemode.Server.Commands message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); string factionName = string.Empty; - if(user.FactionLeader) + if (user.FactionLeader) { factionName = player.GetUser().Faction.Name; } @@ -329,7 +326,7 @@ namespace ReallifeGamemode.Server.Commands deadPlayerUser.Handmoney = 0; deadPlayerUser.BankAccount.Balance -= bankMoney; } - + player.PlayAnimation("amb@medic@standing@kneel@enter", "enter", 0); deadPlayer.TriggerEvent("onPlayerRevived"); @@ -363,7 +360,7 @@ namespace ReallifeGamemode.Server.Commands return; } - if(player.Position.DistanceTo(target.Position) > 5) + if (player.Position.DistanceTo(target.Position) > 5) { ChatService.ErrorMessage(player, "Der Patient ist zu weit entfernt"); return; @@ -398,16 +395,54 @@ namespace ReallifeGamemode.Server.Commands return; } - ChatService.SendMessage(target,"~g~" + player.Name + " ~s~möchte dich für ~g~$" + price + " ~s~heilen. Drücke ~g~J~s~ zum Erlauben oder ~r~N ~s~zum Verbieten"); - player.SendNotification("Du hast " + target.Name + " einen Heal angeboten",false); + ChatService.SendMessage(target, "~g~" + player.Name + " ~s~möchte dich für ~g~$" + price + " ~s~heilen. Drücke ~g~J~s~ zum Erlauben oder ~r~N ~s~zum Verbieten"); + player.SendNotification("Du hast " + target.Name + " einen Heal angeboten", false); target.SetData("healDecision", true); - Medic.HealDecisions.Add(new Medic.HealDecision {dMedic = player, dTarget = target, dPrice = price}); + Medic.HealDecisions.Add(new Medic.HealDecision { dMedic = player, dTarget = target, dPrice = price }); } #endregion Sanitäter Commands #region Staatsfraktionen (LSPD / FBI) Commands + [Command("cuff", "~m~Benutzung: ~s~/cuff")] + public void CmdFactionCuff(Player player) + { + User user = player.GetUser(); + if (user == null || (user.FactionId != 1 && user.FactionId != 3)) + { + ChatService.NotAuthorized(player); + return; + } + + if (!player.IsDuty()) + { + ChatService.ErrorMessage(player, "Du bist nicht im Dienst"); + return; + } + + Player nearestCuffPlayer = PositionManager.cuffPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.6 && user.GetData("duty")); + + if (nearestCuffPlayer is null) + return; + + nearestCuffPlayer.SetInFrontOf(player); + nearestCuffPlayer.Heading = player.Heading; + + if (!nearestCuffPlayer.HasAnimation("Cuffed")) + { + player.SyncAnimation("doArrest"); + nearestCuffPlayer.SyncAnimation(new List() { "getArrest", "Cuffed" }); + player.AddAttachment("handcuffs", false); + } + else + { + player.AddAttachment("handcuffs", true); + player.SyncAnimation("doUncuff"); + nearestCuffPlayer.SyncAnimation("getUncuff"); + } + } + [Command("wanted", "~m~Benutzung: ~s~/wa(nted) [Spieler] [Anzahl] [Grund]", Alias = "wa", GreedyArg = true)] public void CmdFactionWanted(Player player, string nameOrId, int amount, string reason) { @@ -480,7 +515,7 @@ namespace ReallifeGamemode.Server.Commands } ChatService.SendMessage(target, "!{#8181E9}Deine Akte wurde von " + player.Name + " gelöscht. Grund: " + reason); ChatService.BroadcastFaction("!{#8181E9}HQ: Die Akte von " + target.Name + " wurde von " + player.Name + " gelöscht. Grund: " + reason + ".", new List() { 1, 3 }); - + target.TriggerEvent("jailTime", 0); targetUser.Wanteds = 0; @@ -491,11 +526,12 @@ namespace ReallifeGamemode.Server.Commands } #endregion Staatsfraktionen (LSPD / FBI) Commands + #region Weazel News + [Command("eventchat", "~m~Benutzung: ~s~/eventchat [Typ = ~g~on~s~, ~g~off~s~]", GreedyArg = true)] public void CmdFactionNREventchat(Player player, string onoff) { - switch (onoff.ToLower()) { case "on": @@ -513,14 +549,9 @@ namespace ReallifeGamemode.Server.Commands }); player.SendNotification("Der Eventchat ist nun aus."); break; - } - - } - #endregion Weazel News } - } diff --git a/ReallifeGamemode.Server/Commands/UserCommands.cs b/ReallifeGamemode.Server/Commands/UserCommands.cs index 227e80ab..6880fd52 100644 --- a/ReallifeGamemode.Server/Commands/UserCommands.cs +++ b/ReallifeGamemode.Server/Commands/UserCommands.cs @@ -111,7 +111,6 @@ namespace ReallifeGamemode.Server.Commands return; player.SyncAnimation("hup"); - ChatService.SendInRange(player.Position, 20, $"~m~{player.Name} stellt sich..."); } [Command("event", "~m~Benutzung: ~s~/event [Nachricht]", GreedyArg = true)] diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 47807d69..f03b95ea 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -218,6 +218,7 @@ namespace ReallifeGamemode.Server.Events FriseurPoint nearestFriseurPoint = PositionManager.friseurPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.5 && (!user.GetData("duty"))); ItemshopPoint nearestItemShopPoint = PositionManager.itemshopPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.5); JobPoint nearestJobPoint = PositionManager.JobPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.6); + Player nearestCuffPlayer = PositionManager.cuffPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.6 && user.GetData("duty")); if (user?.FactionId != null) { @@ -507,6 +508,24 @@ namespace ReallifeGamemode.Server.Events } player.TriggerEvent("showJailMenu", JsonConvert.SerializeObject(criminals.ToArray())); } + if (nearestCuffPlayer != null) + { + nearestCuffPlayer.SetInFrontOf(player); + nearestCuffPlayer.Heading = player.Heading; + + if (!nearestCuffPlayer.HasAnimation("Cuffed")) + { + player.SyncAnimation("doArrest"); + nearestCuffPlayer.SyncAnimation(new List() { "getArrest", "Cuffed" }); + player.AddAttachment("handcuffs", false); + } + else + { + player.AddAttachment("handcuffs", true); + player.SyncAnimation("doUncuff"); + nearestCuffPlayer.SyncAnimation("getUncuff"); + } + } } if (nearestElevatorPoint != null) { @@ -969,14 +988,19 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("keyPress:ControllH")] public void KeyPressControllH(Player player) { - if (player.HasAnimation("hup")) { player.ClearAnimation(); player.AddAttachment("handcuffs", true); return; } + if (player.HasAnimation("hup")) + { + PositionManager.cuffPoints.Remove(player); + player.ClearAnimation(); + return; + } if (player.HasAnimation()) return; - player.AddAttachment("handcuffs", false); - player.SyncAnimation("hup"); - ChatService.SendInRange(player.Position, 20, $"~m~{player.Name} stellt sich..."); + + if (player.GetUser().Wanteds > 0) + PositionManager.cuffPoints.Add(player); } #endregion User Key diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index 96b81700..4ea122fd 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -321,5 +321,10 @@ namespace ReallifeGamemode.Server.Extensions { player.TriggerEvent("SERVER:SetInFrontPosition", entity); } + + public static void SetCuffable(this Player player, bool isCuffable) + { + player.SetSharedData("Cuffable", isCuffable); + } } } diff --git a/ReallifeGamemode.Server/Managers/PositionManager.cs b/ReallifeGamemode.Server/Managers/PositionManager.cs index ebe2b755..5534a189 100644 --- a/ReallifeGamemode.Server/Managers/PositionManager.cs +++ b/ReallifeGamemode.Server/Managers/PositionManager.cs @@ -26,6 +26,8 @@ namespace ReallifeGamemode.Server.Managers public static List JobPoints = new List(); + public static List cuffPoints = new List(); + public static void LoadPositionManager() { #region DutyPoints From 78f4e136ee83951589900847962b1db9a6e732e0 Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 17:34:18 +0200 Subject: [PATCH 094/116] #15 --- ReallifeGamemode.Client/util/animationSync.ts | 34 ++++++++++++++----- .../Commands/AdminCommands.cs | 2 +- .../Commands/FactionCommands.cs | 16 +-------- ReallifeGamemode.Server/Events/Key.cs | 16 +-------- .../Extensions/ClientExtension.cs | 20 +++++++++-- 5 files changed, 47 insertions(+), 41 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index f0e36c15..bc2f608d 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -1,5 +1,6 @@ export default function animationSync() { let blockInput = false; + let animationBreakTimer; mp.events.add("SERVER:LoadAnimations", () => { animationSyncData.register("Cuffed", "mp_arresting", "idle", -1, true, 50); @@ -11,6 +12,10 @@ animationSyncData.register("carryBox", "anim@heists@box_carry@", "idle", -1, true, 50); }); + const animationBreakMessage = [ + { animName: "Cuffed", msg: "Handschellen gebrochen." } + ]; + const animationSyncData = { animations: [], @@ -76,11 +81,16 @@ }); }, 100); - mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => { + mp.events.addDataHandler("AnimationData", (entity, string) => { entity.clearTasksImmediately(); + + if (animationBreakTimer) { + clearInterval(animationBreakTimer); + animationBreakTimer = null; + } + if (string == null) { blockInput = false; - return; } @@ -96,12 +106,9 @@ mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) }); - let b = setInterval(function () { - mp.events.callRemote("CLIENT:ClearAnimationData", entity); - if (name == "Cuffed" || name == "cuffed") - mp.events.call("renderTextOnScreen", "Handschellen gebrochen."); - clearInterval(b); - }, 120000); + if (mp.players.local == entity && loop) { + animationBreakTimer = setInterval(() => breakAnimation(entity, id), 120000); + } if (!loop) { let a = setInterval(function () { @@ -113,6 +120,17 @@ } }); + function breakAnimation(entity, id) { + mp.events.callRemote("CLIENT:ClearAnimationData", entity); + let { animName, msg } = animationBreakMessage.find(c => mp.game.joaat(c.animName) == id) + + if (msg) + mp.events.call("renderTextOnScreen", msg); + + clearInterval(animationBreakTimer); + animationBreakTimer = null; + } + mp.events.add("render", () => { if (blockInput) { mp.game.controls.disableControlAction(32, 25, true); diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index e4ae58b3..041f31dc 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -1205,7 +1205,7 @@ namespace ReallifeGamemode.Server.Commands [Command("respawnvehicle", "~m~Benutzung: ~s~/respawnvehicle (Db ID)", Alias = "rveh")] public void CmdAdminRespawnVehicle(Player player, int id = -1) { - if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) //change back to Admin { ChatService.NotAuthorized(player); return; diff --git a/ReallifeGamemode.Server/Commands/FactionCommands.cs b/ReallifeGamemode.Server/Commands/FactionCommands.cs index da4d3316..358cb273 100644 --- a/ReallifeGamemode.Server/Commands/FactionCommands.cs +++ b/ReallifeGamemode.Server/Commands/FactionCommands.cs @@ -426,21 +426,7 @@ namespace ReallifeGamemode.Server.Commands if (nearestCuffPlayer is null) return; - nearestCuffPlayer.SetInFrontOf(player); - nearestCuffPlayer.Heading = player.Heading; - - if (!nearestCuffPlayer.HasAnimation("Cuffed")) - { - player.SyncAnimation("doArrest"); - nearestCuffPlayer.SyncAnimation(new List() { "getArrest", "Cuffed" }); - player.AddAttachment("handcuffs", false); - } - else - { - player.AddAttachment("handcuffs", true); - player.SyncAnimation("doUncuff"); - nearestCuffPlayer.SyncAnimation("getUncuff"); - } + player.CuffPlayer(nearestCuffPlayer); } [Command("wanted", "~m~Benutzung: ~s~/wa(nted) [Spieler] [Anzahl] [Grund]", Alias = "wa", GreedyArg = true)] diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index f03b95ea..1643b7ac 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -510,21 +510,7 @@ namespace ReallifeGamemode.Server.Events } if (nearestCuffPlayer != null) { - nearestCuffPlayer.SetInFrontOf(player); - nearestCuffPlayer.Heading = player.Heading; - - if (!nearestCuffPlayer.HasAnimation("Cuffed")) - { - player.SyncAnimation("doArrest"); - nearestCuffPlayer.SyncAnimation(new List() { "getArrest", "Cuffed" }); - player.AddAttachment("handcuffs", false); - } - else - { - player.AddAttachment("handcuffs", true); - player.SyncAnimation("doUncuff"); - nearestCuffPlayer.SyncAnimation("getUncuff"); - } + player.CuffPlayer(nearestCuffPlayer); } } if (nearestElevatorPoint != null) diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index 4ea122fd..f6d06d3a 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -8,6 +8,7 @@ using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Services; using ReallifeGamemode.Server.Types; +using ReallifeGamemode.Server.Util; /** * @overview Life of German Reallife - Player Extension (PlayerExtension.cs) @@ -322,9 +323,24 @@ namespace ReallifeGamemode.Server.Extensions player.TriggerEvent("SERVER:SetInFrontPosition", entity); } - public static void SetCuffable(this Player player, bool isCuffable) + public static void CuffPlayer(this Player player, Player nearestCuffPlayer) { - player.SetSharedData("Cuffable", isCuffable); + nearestCuffPlayer.SetInFrontOf(player); + nearestCuffPlayer.Heading = player.Heading; + + if (!nearestCuffPlayer.HasAnimation("Cuffed")) + { + player.SyncAnimation("doArrest"); + nearestCuffPlayer.SyncAnimation(new List() { "getArrest", "Cuffed" }); + nearestCuffPlayer.AddAttachment("handcuffs", false); + nearestCuffPlayer.RemoveAllWeapons(); + } + else + { + nearestCuffPlayer.AddAttachment("handcuffs", true); + player.SyncAnimation("doUncuff"); + nearestCuffPlayer.SyncAnimation("getUncuff"); + } } } } From d17038f107bf52f694a18b97a628a443b1152ced Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 18:05:32 +0200 Subject: [PATCH 095/116] #15 #16 --- ReallifeGamemode.Server/Util/AnimationSync.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index 7903c127..d4ae704c 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -28,6 +28,9 @@ namespace ReallifeGamemode.Server.Util public static void SyncAnimation(this Player player, List animations) { + if (animations.Count is 0) + return; + string animationName = animations.ElementAt(0); List nextAnimations = animations.Skip(1).ToList(); player.SyncAnimation(animationName); From 9caba94199b72b227b0284d9c8ee0f24081e13cd Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 19:29:08 +0200 Subject: [PATCH 096/116] block input for all firearms #17 --- ReallifeGamemode.Client/util/weapondamage.ts | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/ReallifeGamemode.Client/util/weapondamage.ts b/ReallifeGamemode.Client/util/weapondamage.ts index eae20da7..8f9bf495 100644 --- a/ReallifeGamemode.Client/util/weapondamage.ts +++ b/ReallifeGamemode.Client/util/weapondamage.ts @@ -15,92 +15,79 @@ } }); - mp.events.add('SERVER:WeaponModifier', (player) => { + mp.events.add('SERVER:WeaponModifier', (player: PlayerMp) => { //mp.gui.chat.push("Modifier steht jetzt auf" + modifier); //mp.players.local.setWeaponDamageModifier(modifier); let modifier = 1; let meelemodifier = 1; + blockInput = (mp.game.weapon.getWeapontypeGroup(player.weapon) != 2685387236); + switch (player.weapon) { case 0x1B06D571: //Pistol modifier = 0.4; meelemodifier = 1; - blockInput = true; break; case 0xBFE256D4: //Pistol_MK2 modifier = 0.4; meelemodifier = 1; - blockInput = true; break; case 0x5EF9FEC4: //Combatpistol modifier = 0.5; meelemodifier = 1; - blockInput = true; break; case 0x99AEEB3B: //Pistol50 modifier = 0.35; meelemodifier = 1; - blockInput = true; break; case 0x2BE6766B: //SMG modifier = 0.25; meelemodifier = 1; - blockInput = true; break; case 0x1D073A89: //Pumpshotgun modifier = 0.2; meelemodifier = 1; - blockInput = true; break; case 0x83BF0278: //Cabinerifle modifier = 0.2; meelemodifier = 1; - blockInput = true; break; case 0x624FE830: //Compactrifle modifier = 0.2; meelemodifier = 0.1; - blockInput = true; break; case 0x05FC3C11: //Sniperrifle modifier = 0.5; meelemodifier = 1; - blockInput = true; break; case 0xA2719263: //Meele Umarmed Fist meelemodifier = 0.1; modifier = 1; - blockInput = false; //mp.gui.chat.push("FistModifier: " + meelemodifier); break; case 0x958A4A8F: //Meele Baseball Bat meelemodifier = 0.15; modifier = 1; - blockInput = false; break; case 0x8BB05FD7: //Meele Flashlight meelemodifier = 0.1; modifier = 1; - blockInput = false; break; case 0xD8DF3C3C: //Meele Knuckle meelemodifier = 0.1; modifier = 1; - blockInput = false; //mp.gui.chat.push("KnuckleModifier: " + meelemodifier); break; case 0x678B81B1: //Meele Nightstick meelemodifier = 0.1; modifier = 1; - blockInput = false; break; default: modifier = 1; meelemodifier = 1; - blockInput = false; break; } From 411e509495ae69d68e495bfe5e0c5c0dfa978612 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Wed, 7 Apr 2021 20:35:54 +0200 Subject: [PATCH 097/116] Adjust Gangwar Takeover --- .../Gui/Inventory/inventory.ts | 1182 +---------------- .../Gui/Inventory/inventory_old.ts | 1144 ++++++++++++++++ ReallifeGamemode.Server/Gangwar/Turf.cs | 11 +- 3 files changed, 1217 insertions(+), 1120 deletions(-) create mode 100644 ReallifeGamemode.Client/Gui/Inventory/inventory_old.ts diff --git a/ReallifeGamemode.Client/Gui/Inventory/inventory.ts b/ReallifeGamemode.Client/Gui/Inventory/inventory.ts index 0b4b95d2..afb9e735 100644 --- a/ReallifeGamemode.Client/Gui/Inventory/inventory.ts +++ b/ReallifeGamemode.Client/Gui/Inventory/inventory.ts @@ -1,1145 +1,101 @@ import InputHelper from '../../inputhelper'; export default function inventory(globalData: IGlobalData) { - var q; - var qw = 0; + + var inv; + var showInventory; - var show = false; //ob das Inventar dem Spieler gezeigt wird. - var showAdmin = false; //ob das Inventar eines Spielers dem Admin gezeigt wird + //SCREEN STUFF const { x: screenX, y: screenY } = mp.game.graphics.getScreenActiveResolution(0, 0); let rxC = 0.5; //Breitenpositionierung des Inventars auf Screen-(C)enter let ryC = 0.4; //Höhenpositionierung des Inventars auf Screen-(C)enter - let rWidth = 0.4; - let sX = (screenX * 0.1 / 1000); - let sY = (screenY * 0.1 / 1000); - let eX = sX - 0.1; - let eY = sY - 0.1; let aspectRatioFactor = screenX / screenY; //Höhenmultiplikator (damit Quadrate anstatt Rechtecke der einzelnen Slots entstehen) let sizeMulx = 0.08; //Größenmultiplikator (GUI Skalierung) let sizeMuly = sizeMulx * aspectRatioFactor; //Größenmultiplikator (GUI Skalierung) - let sizeMulxHalf = sizeMulx / 2; - let sizeMulyHalf = sizeMuly / 2; - var targetPlayerName; //Der Spieler der den Handel anfragt - let closePos = [0.7125, 0.17] //Position des X für Adminansicht - let tradeBoxPos = [0.7125, 0.82] //Center der Handelsbox - var clickTime; //Für Berechnung wie lange der Mausklick-Handler zwischen Aktionen benötigt - var itemRadial = false; //Ob das Item-Radialmenü gezeigt wird - var hoverGrid; //Ob man über einem Gridfeld hovert - var radialSelect = "none"; //Auswahl des Radialmenüs - var clickedItem; //Das angeklickte Item für das Radialmenü - //let aspectRatioFactor = ; //Seitenverhältnis des Bildschirms (Entspricht yMul aufgerundet) - var upRColor = 222; //Standard Transparenzen für das Hovern über der Radialauswahl - var downRColor = 222; //Standard Transparenzen für das Hovern über der Radialauswahl - var leftRColor = 222; //Standard Transparenzen für das Hovern über der Radialauswahl - var rightRColor = 222; //Standard Transparenzen für das Hovern über der Radialauswahl - var radialDescription; //Radialbeschreibung die über dem Mauszeiger angezeigt wird wenn man hovert. - var tradePartner = "Keinem"; //Der Spieler mit dem man Handeln möchte - var tradePrize = 0; //Der Preis welcher dem Handelempfänger angezeigt wird - var tradeConfirm = false; //Ob der Handelspartner den Handel akzeptiert - var isTrading = false; //Bestimmt ob das Handelsfenster unten angezeigt wird - var isTradingResult = false; - var dragTradeItem = null; //Ob aktuell ein Item aus dem Handelfenster gezogen wird - var spriteScaleX = rWidth / 8; - var spriteScaleY = rWidth / 8 * aspectRatioFactor; - var syncStatus = false; //Synchronisation mit der Datenbank - var syncCount = 0; //Wieviele Slots noch gesynced werden müssen - var syncDeg = 0; + let rWidth = 0.4; - var inventoryWeight; //Das aktuelle Inventargewicht, berechnet aus allen Metainfos des items[[]] Array - var items = [[]]; //Items aus der Datenbank - var tradeItems = []; //Handelsitems aus der aktuellen Handelssession - var tradeResultItems = [[]]; + class inventory { + slots: slot[]; + slotId: number; + weight: number; + slotAmount: number = 20; - var grid = []; - grid[0] = [0.3375, 0.205] - grid[1] = [0.4195, 0.205] - grid[2] = [0.5015, 0.205] - grid[3] = [0.5835, 0.205] - grid[4] = [0.6655, 0.205] - grid[5] = [0.3375, 0.355] - grid[6] = [0.4195, 0.355] - grid[7] = [0.5015, 0.355] - grid[8] = [0.5835, 0.355] - grid[9] = [0.6655, 0.355] - grid[10] = [0.3375, 0.505] - grid[11] = [0.4195, 0.505] - grid[12] = [0.5015, 0.505] - grid[13] = [0.5835, 0.505] - grid[14] = [0.6655, 0.505] - grid[15] = [0.3375, 0.655] - grid[16] = [0.4195, 0.655] - grid[17] = [0.5015, 0.655] - grid[18] = [0.5835, 0.655] - grid[19] = [0.6655, 0.655] + constructor() { + this.slots[0] = new slot([0.3375, 0.205]) + this.slots[1] = new slot([0.4195, 0.205]) + this.slots[2] = new slot([0.5015, 0.205]) + this.slots[3] = new slot([0.5835, 0.205]) + this.slots[4] = new slot([0.6655, 0.205]) + this.slots[5] = new slot([0.3375, 0.355]) + this.slots[6] = new slot([0.4195, 0.355]) + this.slots[7] = new slot([0.5015, 0.355]) + this.slots[8] = new slot([0.5835, 0.355]) + this.slots[9] = new slot([0.6655, 0.355]) + this.slots[10] = new slot([0.3375, 0.505]) + this.slots[11] = new slot([0.4195, 0.505]) + this.slots[12] = new slot([0.5015, 0.505]) + this.slots[13] = new slot([0.5835, 0.505]) + this.slots[14] = new slot([0.6655, 0.505]) + this.slots[15] = new slot([0.3375, 0.655]) + this.slots[16] = new slot([0.4195, 0.655]) + this.slots[17] = new slot([0.5015, 0.655]) + this.slots[18] = new slot([0.5835, 0.655]) + this.slots[19] = new slot([0.6655, 0.655]) + } - var tradeGrid = []; - tradeGrid[0] = [0.3375, 0.925] - tradeGrid[1] = [0.4195, 0.925] - tradeGrid[2] = [0.5015, 0.925] - tradeGrid[3] = [0.5835, 0.925] - tradeGrid[4] = [0.6655, 0.925] + drawInventoryBackGround() { + mp.game.graphics.set2dLayer(1); // LAYER 1 + mp.game.graphics.drawRect(rxC, ryC, 0.45, 0.7, 255, 255, 255, 200); //INVENTARHINTERGRUND - var mouseLDown = false; //Ob die Linke Maustaste gedrückt wird (while) - var mouseRDown = false; //Ob die Rechte Maustaste gedrückt wird (while) - var hoverItem; //Das Item über welches der Mauszeiger schwebt - var dragItem = null; //Das Item das aktuell gezogen wird - var oldDragSlot; //Ursprungsslot des gezogenen Items - var actFreeSlot; //Ob der aktuelle Hover-Slot während des Item-ziehens frei ist - var actFreeTradeSlot; //Ob der aktuelle TradeInventar-Hover-Slot während des Item-ziehens frei ist - var bufferItem = []; - var stackToItem; //Der Slot zu dem das aktuelle Item gestackt würde, wenn man die Maustaste loslässt - var stackToTradeItem; //Der Handels-Slot zu dem das aktuelle Item gestackt würde, wenn man die Maustaste loslässt + mp.game.graphics.set2dLayer(2); // LAYER 2 - mp.events.add("showInventory", (invWeight, itemArr) => { - if (show === false) { - //mp.gui.chat.activate(false); + //INVENTARÜBERSCHRIFT + mp.game.graphics.drawText("Inventar ~g~" + this.weight + "/40000g", [rxC, ryC - (rWidth / 1.20)], { + font: 7, + color: [112, 128, 144, 254], + scale: [0.7, 0.7], + outline: true, + centre: false + }); + } + } + + class slot { + id: number; + x: number; + y: number; + position: [number, number]; + item: inventoryItem; + + constructor(position) { - mp.gui.cursor.show(true, true); - inventoryWeight = invWeight; - items = itemArr; - show = true; - mp.game.graphics.requestStreamedTextureDict("itemimages", true); - } else { - mp.events.callRemote('saveInventory', JSON.stringify(items)); - mp.gui.chat.activate(true); - mp.gui.cursor.show(false, false); - show = false; - syncCount++; - mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("itemimages"); - inventoryWeight = 0; - items = null; - itemRadial = false; - if (tradeItems.length === 0) { - isTrading = false; - } } - }); + } - //Zeigt dem Handelsanfragenden das Handelsinventar - mp.events.add("openTradeMenu", (tradePartnerName) => { - tradePartner = tradePartnerName; - isTrading = true; - }); + class inventoryItem { + id: number; + name: string; + description: string; + sprite: number; + weight: number; + } - //Zeigt dem Handelspartner das Fenster zur Annahme oder Verweigerung des Handels - mp.events.add("showTradeRequest", () => { - show = false; - }); - - //Zeigt dem Admin das Inventar eines Spielers - mp.events.add("showInventoryToAdmin", (pName, invWeight, itemArr) => { - if (showAdmin === false) { - targetPlayerName = pName; - mp.gui.chat.activate(false); - inventoryWeight = invWeight; - items = itemArr; - mp.game.graphics.requestStreamedTextureDict("itemimages", true); - setTimeout(() => mp.gui.cursor.show(true, true), 100); - showAdmin = true; - } - }); - - //Falls das Inventar aktuell offen ist und ein neues hinzugefügt wird, wird dieses Live angezeigt. - mp.events.add("addItem", (item) => { - if (show) { - items.push(JSON.parse(item)); - } - }); - - //Löscht die Handelsitems beim Handelsanfragenden - mp.events.add("clearTradeItems", () => { - tradeConfirm = false; - tradeItems.splice(0, tradeItems.length); - tradePartner = "Keinem"; - tradePrize = 0; - }); - - - //Zeigt dem Handelspartner die zu handelnden Items unter seinem Inventar an. - mp.events.add("showTradeItems", (tradeResultItemArray) => { - //for (var i = 0; i < tradeResultItemArray.length; i++) { - - // tradeItems.push(tradeResultItemArray[i]); - //} - tradeItems = JSON.parse(tradeResultItemArray); - isTrading = true; - }); - - //Entsperrt beim Handelsanfragenden die Items aus dem Handelsfenster - mp.events.add("unlockTradeItems", () => { - tradeConfirm = false; - tradePartner = "Keinem"; - tradePrize = 0; - }); - - //Falls ein Item administrativ entfernt wird, würde auch dies Live angezeigt. - mp.events.add("removeItem", (userItemId, amount) => { - if (show) { - var arrIndex; - for (var i = 0; i < items.length; i++) { - if (items[i][5] === userItemId) { - arrIndex = i; - } - } - inventoryWeight -= parseInt(items[arrIndex][2]) * amount; - items[arrIndex][3] -= amount; - if (items[arrIndex][3] === 0) { - items.splice(arrIndex, 1); - } - } - }); - - mp.events.add("SERVER:INVENTORY_SYNC", () => { - syncCount--; + mp.events.add("openInventory", (itemArray) => { + var inv = new inventory(); + showInventory = true; }); mp.events.add("render", () => { - var pos; - if (show === true) { - pos = mp.gui.cursor.position; - - for (q = 0; q < items.length; q++) { - mp.game.graphics.drawText("[" + items[q][0] + "]" + "[" + items[q][2] + "]" + "[" + items[q][3] + "]" + "[" + items[q][4] + "]" + "[" + items[q][5] + "]", [0.1, 0.4 + qw], { - //mp.game.graphics.drawText("(MOIN)", [0.1, 0.4 + qw], { - font: 4, - color: [255, 255, 255, 254], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - qw += 0.025; - } - - mp.game.graphics.set2dLayer(1); //# - mp.game.graphics.drawRect(rxC, ryC, 0.45, 0.7, 255, 255, 255, 200); //INVENTARHINTERGRUND - - mp.game.graphics.set2dLayer(2); //## - - //INVENTARÜBERSCHRIFT - mp.game.graphics.drawText("Inventar ~g~" + inventoryWeight + "/40000g", [rxC, ryC - (rWidth / 1.20)], { - font: 7, - color: [112, 128, 144, 254], - scale: [0.7, 0.7], - outline: true, - centre: false - }); - - if (syncCount != 0) { - syncDeg += 3; - if (syncDeg === 360) syncDeg = 0; - - mp.game.graphics.drawText("~s~synchronisiere ~g~ " + syncCount, [rxC + 0.165, ryC - (rWidth / 1.20) + 0.035], { - font: 7, - color: [112, 128, 144, 254], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - mp.game.graphics.drawSprite("itemimages", "refresh", rxC + 0.165, ryC - (rWidth / 1.20) + 0.01, spriteScaleX * 0.4, spriteScaleY * 0.4, syncDeg, 255, 255, 255, 255); - } else { - mp.game.graphics.drawText("~s~synchronisiert", [rxC + 0.165, ryC - (rWidth / 1.20) + 0.035], { - font: 7, - color: [112, 128, 144, 254], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - } - - //SLOTS [RECHTECKE] [SLOTZAHLEN] - - var slots; - var tempSlot; - for (slots = 0; slots < grid.length; slots++) { - mp.game.graphics.drawRect(grid[slots][0], grid[slots][1], sizeMulx, sizeMuly, 112, 128, 144, 254); - mp.game.graphics.drawText(tempSlot = slots + 1, [grid[slots][0] - sizeMulxHalf + 0.006, grid[slots][1] - (sizeMulxHalf * aspectRatioFactor)], { - font: 7, - color: [255, 69, 0, 254], - scale: [0.3, 0.3], - outline: true, - centre: false - }); - } - - mp.game.graphics.set2dLayer(3); //### - - var currentItem; - - //SPRITES + ITEMANZAHL - for (currentItem = 0; currentItem < items.length; currentItem++) { - if (items[currentItem][4] !== "-1") { - mp.game.graphics.drawSprite("itemimages", items[currentItem][0].toLowerCase(), grid[items[currentItem][4] - 1][0], grid[items[currentItem][4] - 1][1], spriteScaleX, spriteScaleY, 0, 255, 255, 255, 255); - mp.game.graphics.drawText("(~y~" + items[currentItem][3] + "~s~)", [grid[items[currentItem][4] - 1][0] + sizeMulxHalf - 0.008, grid[items[currentItem][4] - 1][1] + 0.05], { - font: 0, - color: [255, 255, 255, 255], - scale: [0.25, 0.25], - outline: true, - centre: false - }); - } - } - - var hoverItemP; - - mp.game.graphics.set2dLayer(4); //#### - //WENN MAUS ÜBER ITEM - if (isMouseOverItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) { - mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220); - - hoverItemP = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3]]; - - //NAME - mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - - //BESCHREIBUNG - mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.35, 0.35], - outline: true, - centre: false - }); - - //EINZELGEWICHT - mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.35, 0.35], - outline: true, - centre: false - }); - } - - //WENN MOUSE DOWN - if (mouseLDown && dragItem !== null || mouseRDown && dragItem !== null) { - - if (isMouseOverFreeSlot(pos[0], pos[1]) || isMouseOverFreeTradeSlot(pos[0], pos[1]) || isItemOverSameItem(pos[0], pos[1]) || isItemOverSameTradeItem(pos[0], pos[1])) { - if (dragTradeItem === false) { - mp.game.graphics.drawSprite("itemimages", items[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, spriteScaleX, spriteScaleY, 0, 100, 255, 100, 255); - } else { - mp.game.graphics.drawSprite("itemimages", tradeItems[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, spriteScaleX, spriteScaleY, 0, 100, 255, 100, 255); - } - } else { - if (dragTradeItem === false) { - mp.game.graphics.drawSprite("itemimages", items[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, spriteScaleX, spriteScaleY, 0, 255, 100, 100, 255); - } else { - mp.game.graphics.drawSprite("itemimages", tradeItems[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, spriteScaleX, spriteScaleY, 0, 255, 100, 100, 255); - } - } - } - mp.game.graphics.set2dLayer(5); //##### - if (itemRadial === true) { - mp.game.graphics.drawSprite("itemimages", "radialsplit", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 0, 0, 0, 255); - mp.game.graphics.drawSprite("itemimages", "radialup", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, upRColor, 222, upRColor); - mp.game.graphics.drawSprite("itemimages", "radialdown", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, downRColor, 222, downRColor); - //mp.game.graphics.drawSprite("itemimages", "radialleft", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, leftRColor, 222, leftRColor); - //mp.game.graphics.drawSprite("itemimages", "radialright", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, rightRColor, 222, rightRColor); - - mp.game.graphics.set2dLayer(6); //###### - mp.game.graphics.drawSprite("itemimages", "radialdrop", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 255, 255, 255, 255); - mp.game.graphics.drawSprite("itemimages", "radialuse", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 255, 255, 255, 255); - } - mp.game.graphics.set2dLayer(7); //####### - - if (ifMouseSelectRadial(pos[0], pos[1])) { - //mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY - 0.02, 0.08, 0.03, 0, 0, 0, 255); - mp.game.graphics.drawText("~g~" + radialDescription, [pos[0] / screenX, pos[1] / screenY - 0.033], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.5, 0.5], - outline: true, - centre: false - }); - } - if (isTrading) { - mp.game.graphics.set2dLayer(1); - mp.game.graphics.drawRect(rxC, 0.925, 0.45, 0.25, 255, 255, 255, 200); - mp.game.graphics.set2dLayer(2); - var tempSlot2; - for (slots = 0; slots < tradeGrid.length; slots++) { - mp.game.graphics.drawRect(tradeGrid[slots][0], tradeGrid[slots][1], sizeMulx, sizeMuly, 112, 128, 144, 254); - mp.game.graphics.drawText(tempSlot2 = slots + 1, [tradeGrid[slots][0] - sizeMulxHalf + 0.006, tradeGrid[slots][1] - (sizeMulxHalf * aspectRatioFactor)], { - font: 7, - color: [69, 255, 0, 254], - scale: [0.3, 0.3], - outline: true, - centre: false - }); - } - - mp.game.graphics.set2dLayer(3); - - //SPRITES + ITEMANZAHL - if (tradeItems.length !== 0) { - for (currentItem = 0; currentItem < tradeItems.length; currentItem++) { - if (tradeItems[currentItem][4] !== "-1") { - mp.game.graphics.drawSprite("itemimages", tradeItems[currentItem][0].toLowerCase(), tradeGrid[tradeItems[currentItem][4] - 1][0], tradeGrid[tradeItems[currentItem][4] - 1][1], spriteScaleX, spriteScaleY, 0, 255, 255, 255, 255); - mp.game.graphics.drawText("(~y~" + tradeItems[currentItem][3] + "~s~)", [tradeGrid[tradeItems[currentItem][4] - 1][0] + sizeMulxHalf - 0.008, tradeGrid[tradeItems[currentItem][4] - 1][1] + 0.05], { - font: 0, - color: [255, 255, 255, 255], - scale: [0.25, 0.25], - outline: true, - centre: false - }); - if (tradeConfirm === true) { - mp.game.graphics.drawSprite("itemimages", "lock", tradeGrid[tradeItems[currentItem][4] - 1][0], tradeGrid[tradeItems[currentItem][4] - 1][1], spriteScaleX / 2, spriteScaleY / 2, 0, 255, 255, 255, 255); - } - } - } - } - //} else { - // if (tradeResultItems.length !== 0) { - // for (var currentItem = 0; currentItem < tradeResultItems.length; currentItem++) { - // mp.game.graphics.drawSprite("itemimages", tradeResultItems[currentItem][0].toLowerCase(), tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][0], tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][1], spriteScaleX, spriteScaleY, 0, 255, 255, 255, 255); - // mp.game.graphics.drawText("(~y~" + tradeResultItems[currentItem][3] + "~s~)", [tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][0] + (sizeMul / 2) - 0.008, tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][1] + 0.05], { - // font: 0, - // color: [255, 255, 255, 255], - // scale: [0.25, 0.25], - // outline: true, - // }); - // } - // } - //} - - mp.game.graphics.drawText("Handel mit ~y~" + tradePartner + " ~s~ für ~g~ " + tradePrize + "$", [rxC, 0.81], { - font: 7, - color: [112, 128, 144, 254], - scale: [0.6, 0.6], - outline: true, - centre: false - }); - mp.game.graphics.set2dLayer(4); - if (tradeConfirm === false) { - mp.game.graphics.drawSprite("itemimages", "box", tradeBoxPos[0], tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255); - } else { - mp.game.graphics.drawSprite("itemimages", "boxticked", tradeBoxPos[0], tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255); - } - mp.game.graphics.drawSprite("itemimages", "dollar", tradeBoxPos[0] - 0.025, tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255); - - if (isMouseOverTradeDollar(pos[0], pos[1])) { - mp.game.graphics.drawText("~g~ Preis festlegen", [pos[0] / screenX, pos[1] / screenY - 0.033], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.5, 0.5], - outline: true, - centre: false - }); - } - if (isMouseOverTradeBox(pos[0], pos[1])) { - mp.game.graphics.drawText("~g~Handelsanfrage absenden", [pos[0] / screenX, pos[1] / screenY - 0.033], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.5, 0.5], - outline: true, - centre: false - }); - } - - mp.game.graphics.set2dLayer(5); - if (isMouseOverTradeItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) { - mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220); - - hoverItemP = [tradeItems[hoverItem][0], tradeItems[hoverItem][1], tradeItems[hoverItem][2], tradeItems[hoverItem][3]]; - - //NAME - mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - - //BESCHREIBUNG - mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.35, 0.35], - outline: true, - centre: false - }); - - //EINZELGEWICHT - mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.35, 0.35], - outline: true, - centre: false - }); - } - } - - - - ////--------------------------------------------------------------DEBUG - //mp.game.graphics.drawText(itemRadial.toString() + " ~y~" + radialSelect, [0.5, 0.05], { - // font: 7, - // color: [255, 0, 0, 255], - // scale: [0.7, 0.7], - // outline: true, - //}); - ////KOORDINATEN - //mp.game.graphics.drawText((pos[0] / screenX).toFixed(3) + " / " + (pos[1] / screenY).toFixed(3) + " " + tradeItems.length, [pos[0] / screenX, pos[1] / screenY - 0.02], { - // font: 4, - // color: [255, 255, 255, 255], - // scale: [0.4, 0.4], - // outline: true, - //}); - ////----------------------------------------------------------DEBUG END - } - qw = 0; - if (showAdmin === true) { - pos = mp.gui.cursor.position; - - mp.game.graphics.set2dLayer(1); - //INVENTARHINTERGRUND - mp.game.graphics.drawRect(rxC, ryC, 0.45, 0.7, 255, 255, 255, 200); - - mp.game.graphics.set2dLayer(2); - //INVENTARÜBERSCHRIFT - mp.game.graphics.drawText("Inventar von ~y~" + targetPlayerName + " ~g~" + inventoryWeight + "/40000g", [rxC, ryC - (rWidth / 1.20)], { - font: 7, - color: [112, 128, 144, 254], - scale: [0.7, 0.7], - outline: true, - centre: false - }); - - //SLOTS [RECHTECKE] [SLOTZAHLEN] - for (slots = 0; slots < grid.length; slots++) { - mp.game.graphics.drawRect(grid[slots][0], grid[slots][1], sizeMulx, sizeMuly, 112, 128, 144, 254); - mp.game.graphics.drawText(tempSlot = slots + 1, [grid[slots][0] - sizeMulxHalf + 0.006, grid[slots][1] - (sizeMulxHalf * aspectRatioFactor)], { - font: 7, - color: [255, 69, 0, 254], - scale: [0.3, 0.3], - outline: true, - centre: false - }); - } - - mp.game.graphics.set2dLayer(3); - //SPRITES + ITEMANZAHL - for (currentItem = 0; currentItem < items.length; currentItem++) { - if (items[currentItem][4] !== "-1") { - mp.game.graphics.drawSprite("itemimages", items[currentItem][0].toLowerCase(), grid[items[currentItem][4] - 1][0], grid[items[currentItem][4] - 1][1], spriteScaleX, spriteScaleY, 0, 255, 255, 255, 255); - mp.game.graphics.drawText("(~y~" + items[currentItem][3] + "~s~)", [grid[items[currentItem][4] - 1][0] + sizeMulxHalf - 0.008, grid[items[currentItem][4] - 1][1] + 0.05], { - font: 0, - color: [255, 255, 255, 255], - scale: [0.25, 0.25], - outline: true, - centre: false - }); - } - } - - mp.game.graphics.set2dLayer(4); - //WENN MAUS ÜBER ITEM - if (isMouseOverItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) { - mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220); - - hoverItemP = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3]]; - - //NAME - mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - - //BESCHREIBUNG - mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.35, 0.35], - outline: true, - centre: false - }); - - //EINZELGEWICHT - mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], { - font: 4, - color: [255, 255, 255, 255], - scale: [0.35, 0.35], - outline: true, - centre: false - }); - } - - if (isMouseOverX(pos[0], pos[1])) { - mp.game.graphics.drawSprite("itemimages", "x", closePos[0], closePos[1], 0.02, 0.035, 0, 220, 20, 60, 255); - } else { - mp.game.graphics.drawSprite("itemimages", "x", closePos[0], closePos[1], 0.02, 0.035, 0, 255, 255, 255, 255); - } + if (showInventory) { } }); - function isMouseOverItem(cX, cY) { + function initInventory(slots) { - var x, y, a, b, c, s, invSlot; - x = cX / screenX; - y = cY / screenY; - if (dragItem === null) { - for (s = 0; s < 20; s++) { - a = grid[s][0] - x; - b = grid[s][1] - y; - c = Math.sqrt(a * a + b * b); - invSlot = (s + 1); - if (c < sizeMulxHalf) { - for (var i = 0; i < items.length; i++) { - if (parseInt(items[i][4]) === invSlot) { - hoverItem = i; - return true; - } - } - } - } - } else { - if (itemRadial === false) { - for (s = 0; s < 20; s++) { - a = grid[s][0] - x; - b = grid[s][1] - y; - c = Math.sqrt(a * a + b * b); - invSlot = (s + 1); - if (c < sizeMulxHalf) { - for (i = 0; i < items.length; i++) { - if (parseInt(items[i][4]) === invSlot) { - hoverGrid = s; - return true; - } - } - } - } - } - } - } - function isMouseOverTradeItem(cX, cY) { - - if (dragItem === null && isTrading) { - - var x = cX / screenX; - var y = cY / screenY; - var a; - var b; - var c; - - for (var s = 0; s < 5; s++) { - a = tradeGrid[s][0] - x; - b = tradeGrid[s][1] - y; - c = Math.sqrt(a * a + b * b); - - var invSlot = (s + 1); - - if (c < sizeMulxHalf) { - for (var i = 0; i < tradeItems.length; i++) { - if (parseInt(tradeItems[i][4]) === invSlot) { - hoverItem = i; - return true; - } - } - } - } - } } - function isMouseOverFreeSlot(cX2, cY2) { - - var x = cX2 / screenX; - var y = cY2 / screenY; - var isItemOnSlot = 0; - - for (var s = 0; s < 20; s++) { - var invSlot = (s + 1); - - if (x > grid[s][0] - sizeMulxHalf && x < grid[s][0] + sizeMulxHalf && y > grid[s][1] - sizeMulxHalf * aspectRatioFactor && y < grid[s][1] + sizeMulxHalf * aspectRatioFactor) { - for (var i = 0; i < items.length; i++) { - if (parseInt(items[i][4]) === invSlot) { - isItemOnSlot++; - } - } - if (isItemOnSlot === 0) { - actFreeSlot = s + 1; - return true; - } - } - } - } - - function isMouseOverFreeTradeSlot(cX2, cY2) { - - if (tradeConfirm === false) { - var x = cX2 / screenX; - var y = cY2 / screenY; - var isItemOnSlot = 0; - - for (var s = 0; s < 5; s++) { - var invSlot = (s + 1); - - if (x > tradeGrid[s][0] - sizeMulxHalf && x < tradeGrid[s][0] + sizeMulxHalf && y > tradeGrid[s][1] - sizeMulxHalf * aspectRatioFactor && y < tradeGrid[s][1] + sizeMulxHalf * aspectRatioFactor) { - for (var i = 0; i < tradeItems.length; i++) { - if (parseInt(tradeItems[i][4]) === invSlot) { - isItemOnSlot++; - } - } - if (isItemOnSlot === 0) { - actFreeTradeSlot = s + 1; - return true; - } - } - } - } - } - - function isItemOverSameItem(cX2, cY2) { - - if (dragItem !== null && items.length > 0) { - var x = cX2 / screenX; - var y = cY2 / screenY; - - for (var s = 0; s < 20; s++) { - var invSlot = (s + 1); - - if (x > grid[s][0] - sizeMulxHalf && x < grid[s][0] + sizeMulxHalf && y > grid[s][1] - sizeMulxHalf * aspectRatioFactor && y < grid[s][1] + sizeMulxHalf * aspectRatioFactor) { - - for (var i = 0; i < items.length; i++) { - if (dragTradeItem === false) { - if (items[dragItem][0] === items[i][0] && parseInt(items[i][4]) === invSlot && items[hoverItem][4] !== items[i][4]) { - stackToItem = i; - return true; - } - } else { - if (tradeItems[dragItem][0] === items[i][0] && parseInt(items[i][4]) === invSlot) { - stackToItem = i; - return true; - } - } - } - } - } - } - } - - function isItemOverSameTradeItem(cX2, cY2) { - - if (dragItem !== null && tradeItems.length > 0) { - var x = cX2 / screenX; - var y = cY2 / screenY; - for (var s = 0; s < 5; s++) { - var invSlot = (s + 1); - - if (x > tradeGrid[s][0] - sizeMulxHalf && x < tradeGrid[s][0] + sizeMulxHalf && y > tradeGrid[s][1] - sizeMulxHalf * aspectRatioFactor && y < tradeGrid[s][1] + sizeMulxHalf * aspectRatioFactor) { - - for (var i = 0; i < tradeItems.length; i++) { - if (dragTradeItem === false) { - if (items[dragItem][0] === tradeItems[i][0] && parseInt(tradeItems[i][4]) === invSlot) { - stackToTradeItem = i; - return true; - } - } else { - if (tradeItems[dragItem][0] === tradeItems[i][0] && parseInt(tradeItems[i][4]) === invSlot && tradeItems[hoverItem][4] !== tradeItems[i][4]) { - stackToTradeItem = i; - return true; - } - } - } - } - } - } - } - - function isMouseOverX(cX2, cY2) { - if (showAdmin) { - var x = cX2 / screenX; - var y = cY2 / screenY; - - if (x > closePos[0] - 0.01 && x < closePos[0] + 0.01 && y > closePos[1] - 0.0175 && y < closePos[1] + 0.0175) { - return true; - } - } - } - - function isMouseOverTradeBox(cX2, cY2) { - if (show && tradeConfirm === false) { - var x = cX2 / screenX; - var y = cY2 / screenY; - - if (x > tradeBoxPos[0] - 0.01 && x < tradeBoxPos[0] + 0.01 && y > tradeBoxPos[1] - 0.0175 && y < tradeBoxPos[1] + 0.0175) { - return true; - } - } - } - - function isMouseOverTradeDollar(cX2, cY2) { - if (show && tradeConfirm === false) { - var x = cX2 / screenX; - var y = cY2 / screenY; - - if (x > (tradeBoxPos[0] - 0.025) - 0.01 && x < (tradeBoxPos[0] - 0.025) + 0.01 && y > tradeBoxPos[1] - 0.0175 && y < tradeBoxPos[1] + 0.0175) { - return true; - } - } - } - - function ifMouseSelectRadial(cX2, cY2) { - if (show && itemRadial === true) { - var x = cX2 / screenX; - var y = cY2 / screenY; - var a; - var b; - var c; - - //OBEN - if (x > grid[hoverGrid][0] - 0.0255 / aspectRatioFactor && x < grid[hoverGrid][0] + 0.0255 / aspectRatioFactor && y < grid[hoverGrid][1] - 0.065 && y > grid[hoverGrid][1] - 0.2) { - radialSelect = "up"; - radialDescription = "Wegwerfen"; - upRColor = 255; - return true; - } - //UNTEN - else if (x > grid[hoverGrid][0] - 0.0255 / aspectRatioFactor && x < grid[hoverGrid][0] + 0.0255 / aspectRatioFactor && y > grid[hoverGrid][1] + 0.065 && y < grid[hoverGrid][1] + 0.2) { - radialSelect = "down"; - radialDescription = "Benutzen / Essen"; - downRColor = 255; - return true; - } - ////LINKS - //else if (x > grid[hoverGrid][0] - 0.2 / aspectRatioFactor && x < grid[hoverGrid][0] - 0.065 / aspectRatioFactor && y < grid[hoverGrid][1] + 0.0255 && y > grid[hoverGrid][1] - 0.0255) { - // radialSelect = "left"; - // leftRColor = 255; - // return true; - //} - ////RECHTS - //else if (x < grid[hoverGrid][0] + 0.2 / aspectRatioFactor && x > grid[hoverGrid][0] + 0.065 / aspectRatioFactor && y < grid[hoverGrid][1] + 0.0255 && y > grid[hoverGrid][1] - 0.0255) { - // radialSelect = "right"; - // rightRColor = 255; - // return true; - else { - upRColor = 222; - downRColor = 222; - leftRColor = 222; - rightRColor = 222; - } - } - } - - - //Mausklick Events - mp.events.add('click', (x, y, upOrDown, leftOrRight, relativeX, relativeY, worldPosition, hitEntity) => { - - if (show) { - //LINKE MAUSTASTE - //RUNTER - if (upOrDown === "down" && leftOrRight === "left" && mouseLDown === false && mouseRDown === false) { - - mouseLDown = true; - - //Wenn Maus über grünen Haken - if (isTrading && isMouseOverTradeBox(x, y) && tradePrize > 0) { - tradeConfirm = true; - mp.events.callRemote('sendTradeItemsToPartner', JSON.stringify(tradeItems), tradePrize, tradePartner); - } - - //Wenn Maus über Dollar Zeichen - if (isTrading && isMouseOverTradeDollar(x, y)) { - globalData.InMenu = true; - var tradeMoney = new InputHelper("Wie viel $ möchtest du für deine Items haben?", globalData); - tradeMoney.show(); - tradeMoney.getValue((data) => { - var amount = parseInt(data); - if (isNaN(amount) || amount < 0) { - mp.game.graphics.notify('~r~Du musst eine Zahl größer als 0 eingeben!'); - return; - } - globalData.InMenu = false; - tradePrize = amount; - }); - } - - //Wenn Maus über Item - if (isMouseOverItem(x, y) && dragItem === null && itemRadial === false) { - dragItem = hoverItem; - oldDragSlot = items[dragItem][4]; - items[dragItem][4] = "-1"; - dragTradeItem = false; - } - //wenn Maus über Radialmenü - if (ifMouseSelectRadial(x, y)) { - switch (radialSelect) { - case "up": - var dropInput = new InputHelper("Wie viel Items möchtest du wegwerfen?", globalData); - globalData.InMenu = true; - dropInput.show(); - dropInput.getValue((data) => { - var amount = parseInt(data); - if (isNaN(amount) || amount < 1) { - mp.game.graphics.notify('~r~Du musst eine Zahl größer als 0 eingeben!'); - return; - } else if (amount > parseInt(items[clickedItem][3])) { - mp.game.graphics.notify('~r~So viele Items hast du nicht!'); - return; - } - mp.events.callRemote('itemInteract', "drop", items[clickedItem][5], amount); - }); - globalData.InMenu = false; - itemRadial = false; - break; - case "down": - mp.events.callRemote('itemInteract', "use", items[clickedItem][5], 1); - itemRadial = false; - break; - case "left": - itemRadial = false; - break; - case "right": - itemRadial = false; - break; - } - } - //Wenn Maus über Tradeitem - if (isMouseOverTradeItem(x, y) && dragItem === null && itemRadial === false && tradeConfirm === false) { - dragItem = hoverItem; - oldDragSlot = tradeItems[dragItem][4]; - tradeItems[dragItem][4] = "-1"; - dragTradeItem = true; - } - } - - //HOCH - if (upOrDown === "up" && leftOrRight === "left" && mouseLDown === true && itemRadial === false) { - - mouseLDown = false; - - if (dragItem !== null) { - var newAmount; - - //wenn Maus über freien Slot - if (isMouseOverFreeSlot(x, y)) { - if (dragTradeItem === false) { - items[dragItem][4] = actFreeSlot; - } else { - items.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], tradeItems[dragItem][3], actFreeSlot.toString(), tradeItems[dragItem][5]]); - tradeItems.splice(dragItem, 1); - } - syncCount++; - mp.events.callRemote('saveInventory', JSON.stringify(items)); - oldDragSlot = null; - dragItem = null; - hoverItem = null; - } else if (isItemOverSameItem(x, y)) { - if (dragTradeItem === false) { - newAmount = parseInt(items[stackToItem][3]) + parseInt(items[dragItem][3]); - items[stackToItem][3] = newAmount.toString(); - items[dragItem][4] = "-1"; - } else { - newAmount = parseInt(items[stackToItem][3]) + parseInt(tradeItems[dragItem][3]); - items[stackToItem][3] = newAmount.toString(); - tradeItems.splice(dragItem, 1); - } - syncCount++; - mp.events.callRemote('saveInventory', JSON.stringify(items)); - oldDragSlot = null; - dragItem = null; - hoverItem = null; - } else if (isItemOverSameTradeItem(x, y)) { - if (dragTradeItem === false) { - newAmount = parseInt(tradeItems[stackToTradeItem][3]) + parseInt(items[dragItem][3]); - tradeItems[stackToTradeItem][3] = newAmount.toString(); - items[dragItem][4] = "-1"; - } else { - newAmount = parseInt(tradeItems[stackToTradeItem][3]) + parseInt(tradeItems[dragItem][3]); - tradeItems[stackToTradeItem][3] = newAmount.toString(); - tradeItems[dragItem][4] = "-1"; - } - syncCount++; - mp.events.callRemote('saveInventory', JSON.stringify(items)); - oldDragSlot = null; - dragItem = null; - hoverItem = null; - } else if (isMouseOverFreeTradeSlot(x, y)) { - if (dragTradeItem === false) { - tradeItems.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], items[dragItem][3], actFreeTradeSlot.toString(), items[dragItem][5]]); - items.splice(dragItem, 1); - } else { - tradeItems[dragItem][4] = actFreeTradeSlot; - } - syncCount++; - mp.events.callRemote('saveInventory', JSON.stringify(items)); - oldDragSlot = null; - dragItem = null; - hoverItem = null; - } else { - if (dragTradeItem === false) { - items[dragItem][4] = oldDragSlot; - } else { - tradeItems[dragItem][4] = oldDragSlot; - } - oldDragSlot = null; - dragItem = null; - hoverItem = null; - } - } - } - - //RECHTE MAUSTASTE - //RUNTER - if (upOrDown === "down" && leftOrRight === "right" && mouseLDown === false && mouseRDown === false && itemRadial === false) { - clickTime = Date.now(); - mouseRDown = true; - - if (isMouseOverItem(x, y) && dragItem === null) { - dragItem = hoverItem; - oldDragSlot = items[hoverItem][4]; - bufferItem = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3], items[hoverItem][4], items[hoverItem][5]]; - items[hoverItem][3]--; - dragTradeItem = false; - } else if (isMouseOverTradeItem(x, y) && dragItem === null && tradeConfirm === false) { - dragItem = hoverItem; - oldDragSlot = tradeItems[hoverItem][4]; - bufferItem = [tradeItems[hoverItem][0], tradeItems[hoverItem][1], tradeItems[hoverItem][2], tradeItems[hoverItem][3], tradeItems[hoverItem][4], tradeItems[hoverItem][5]]; - tradeItems[hoverItem][3]--; - dragTradeItem = true; - } - } - - //HOCH - if (upOrDown === "up" && leftOrRight === "right" && mouseRDown === true && itemRadial === false) { - mouseRDown = false; - if (Date.now() - clickTime < 100 && isMouseOverItem(x, y)) { - clickedItem = hoverItem; - items[hoverItem][3]++; - itemRadial = true; - hoverItem = null; - dragItem = null; - clickTime = null; - } else { - if (dragItem !== null) { - if (isMouseOverFreeSlot(x, y)) { - if (dragTradeItem === false) { - items.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], "1", actFreeSlot.toString(), "-1"]); - if (items[hoverItem][3] === 0) { - items[hoverItem][4] = "-1"; - items.splice(hoverItem, 1); - } - } else { - items.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], "1", actFreeSlot.toString(), "-1"]); - if (tradeItems[hoverItem][3] === 0) { - tradeItems.splice(hoverItem, 1); - } - } - syncCount++; - mp.events.callRemote('saveInventory', JSON.stringify(items)); - oldDragSlot = null; - dragItem = null; - hoverItem = null; - } else if (isItemOverSameItem(x, y)) { - items[stackToItem][3]++; - if (dragTradeItem === false) { - if (items[hoverItem][3] === 0) { - items[hoverItem][4] = "-1"; - } - } else { - if (tradeItems[hoverItem][3] === 0) { - tradeItems.splice(hoverItem, 1); - } - } - syncCount++; - mp.events.callRemote('saveInventory', JSON.stringify(items)); - bufferItem = null; - dragItem = null; - hoverItem = null; - oldDragSlot = null; - } else if (isItemOverSameTradeItem(x, y)) { - tradeItems[stackToTradeItem][3]++; - if (dragTradeItem === false) { - if (items[hoverItem][3] === 0) { - items[hoverItem][4] = "-1"; - } - } else { - if (tradeItems[hoverItem][3] === 0) { - tradeItems[hoverItem][4] = "-1"; - } - } - syncCount++; - mp.events.callRemote('saveInventory', JSON.stringify(items)); - oldDragSlot = null; - bufferItem = null; - dragItem = null; - hoverItem = null; - } else if (isMouseOverFreeTradeSlot(x, y)) { - if (dragTradeItem === false) { - tradeItems.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], "1", actFreeTradeSlot.toString(), "-1"]); - if (items[hoverItem][3] === 0) { - items[hoverItem][4] = "-1"; - } - } else { - tradeItems.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], "1", actFreeTradeSlot.toString(), "-1"]); - if (tradeItems[hoverItem][3] === 0) { - tradeItems[hoverItem][4] = "-1"; - } - } - syncCount++; - mp.events.callRemote('saveInventory', JSON.stringify(items)); - oldDragSlot = null; - dragItem = null; - hoverItem = null; - } else { - if (dragTradeItem === false) { - items[hoverItem][3]++; - } else { - tradeItems[hoverItem][3]++; - } - oldDragSlot = null; - bufferItem = null; - dragItem = null; - hoverItem = null; - } - } - } - } - } - if (showAdmin) { - //LINKE MAUSTASTE - //RUNTER - if (upOrDown === "down" && leftOrRight === "left" && mouseLDown === false && mouseRDown === false) { - - if (isMouseOverItem(x, y)) { - items[hoverItem][4] = "-1"; - inventoryWeight -= parseInt(items[hoverItem][2]) * parseInt(items[hoverItem][3]); - mp.events.callRemote('removeItemAsAdmin', "stack", items[hoverItem][5], targetPlayerName); - } else if (isMouseOverX(x, y)) { - mp.gui.chat.activate(true); - mp.gui.cursor.show(false, false); - showAdmin = false; - mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("itemimages"); - inventoryWeight = 0; - items = null; - } - } - - //RECHTE MAUSTASTE - //RUNTER - if (upOrDown === "down" && leftOrRight === "right" && mouseLDown === false && mouseRDown === false) { - - if (isMouseOverItem(x, y)) { - items[hoverItem][3]--; - mp.events.callRemote('removeItemAsAdmin', "one", items[hoverItem][5], targetPlayerName); - if (items[hoverItem][3] === 0) { - items[hoverItem][4] = "-1"; - } - inventoryWeight -= items[hoverItem][2]; - } - } - } - }); + } \ No newline at end of file diff --git a/ReallifeGamemode.Client/Gui/Inventory/inventory_old.ts b/ReallifeGamemode.Client/Gui/Inventory/inventory_old.ts new file mode 100644 index 00000000..2f6deb02 --- /dev/null +++ b/ReallifeGamemode.Client/Gui/Inventory/inventory_old.ts @@ -0,0 +1,1144 @@ +import InputHelper from '../../inputhelper'; + +export default function inventory(globalData: IGlobalData) { + var q; + var qw = 0; + var show = false; //ob das Inventar dem Spieler gezeigt wird. + var showAdmin = false; //ob das Inventar eines Spielers dem Admin gezeigt wird + const { x: screenX, y: screenY } = mp.game.graphics.getScreenActiveResolution(0, 0); + let rxC = 0.5; //Breitenpositionierung des Inventars auf Screen-(C)enter + let ryC = 0.4; //Höhenpositionierung des Inventars auf Screen-(C)enter + let rWidth = 0.4; + let sX = (screenX * 0.1 / 1000); + let sY = (screenY * 0.1 / 1000); + let eX = sX - 0.1; + let eY = sY - 0.1; + let aspectRatioFactor = screenX / screenY; //Höhenmultiplikator (damit Quadrate anstatt Rechtecke der einzelnen Slots entstehen) + let sizeMulx = 0.08; //Größenmultiplikator (GUI Skalierung) + let sizeMuly = sizeMulx * aspectRatioFactor; //Größenmultiplikator (GUI Skalierung) + let sizeMulxHalf = sizeMulx / 2; + let sizeMulyHalf = sizeMuly / 2; + var targetPlayerName; //Der Spieler der den Handel anfragt + let closePos = [0.7125, 0.17] //Position des X für Adminansicht + let tradeBoxPos = [0.7125, 0.82] //Center der Handelsbox + var clickTime; //Für Berechnung wie lange der Mausklick-Handler zwischen Aktionen benötigt + var itemRadial = false; //Ob das Item-Radialmenü gezeigt wird + var hoverGrid; //Ob man über einem Gridfeld hovert + var radialSelect = "none"; //Auswahl des Radialmenüs + var clickedItem; //Das angeklickte Item für das Radialmenü + //let aspectRatioFactor = ; //Seitenverhältnis des Bildschirms (Entspricht yMul aufgerundet) + var upRColor = 222; //Standard Transparenzen für das Hovern über der Radialauswahl + var downRColor = 222; //Standard Transparenzen für das Hovern über der Radialauswahl + var leftRColor = 222; //Standard Transparenzen für das Hovern über der Radialauswahl + var rightRColor = 222; //Standard Transparenzen für das Hovern über der Radialauswahl + var radialDescription; //Radialbeschreibung die über dem Mauszeiger angezeigt wird wenn man hovert. + var tradePartner = "Keinem"; //Der Spieler mit dem man Handeln möchte + var tradePrize = 0; //Der Preis welcher dem Handelempfänger angezeigt wird + var tradeConfirm = false; //Ob der Handelspartner den Handel akzeptiert + var isTrading = false; //Bestimmt ob das Handelsfenster unten angezeigt wird + var isTradingResult = false; + var dragTradeItem = null; //Ob aktuell ein Item aus dem Handelfenster gezogen wird + var spriteScaleX = rWidth / 8; + var spriteScaleY = rWidth / 8 * aspectRatioFactor; + var syncStatus = false; //Synchronisation mit der Datenbank + var syncCount = 0; //Wieviele Slots noch gesynced werden müssen + var syncDeg = 0; + + var inventoryWeight; //Das aktuelle Inventargewicht, berechnet aus allen Metainfos des items[[]] Array + var items = [[]]; //Items aus der Datenbank + var tradeItems = []; //Handelsitems aus der aktuellen Handelssession + var tradeResultItems = [[]]; + + var grid = []; + grid[0] = [0.3375, 0.205] + grid[1] = [0.4195, 0.205] + grid[2] = [0.5015, 0.205] + grid[3] = [0.5835, 0.205] + grid[4] = [0.6655, 0.205] + grid[5] = [0.3375, 0.355] + grid[6] = [0.4195, 0.355] + grid[7] = [0.5015, 0.355] + grid[8] = [0.5835, 0.355] + grid[9] = [0.6655, 0.355] + grid[10] = [0.3375, 0.505] + grid[11] = [0.4195, 0.505] + grid[12] = [0.5015, 0.505] + grid[13] = [0.5835, 0.505] + grid[14] = [0.6655, 0.505] + grid[15] = [0.3375, 0.655] + grid[16] = [0.4195, 0.655] + grid[17] = [0.5015, 0.655] + grid[18] = [0.5835, 0.655] + grid[19] = [0.6655, 0.655] + + var tradeGrid = []; + tradeGrid[0] = [0.3375, 0.925] + tradeGrid[1] = [0.4195, 0.925] + tradeGrid[2] = [0.5015, 0.925] + tradeGrid[3] = [0.5835, 0.925] + tradeGrid[4] = [0.6655, 0.925] + + var mouseLDown = false; //Ob die Linke Maustaste gedrückt wird (while) + var mouseRDown = false; //Ob die Rechte Maustaste gedrückt wird (while) + var hoverItem; //Das Item über welches der Mauszeiger schwebt + var dragItem = null; //Das Item das aktuell gezogen wird + var oldDragSlot; //Ursprungsslot des gezogenen Items + var actFreeSlot; //Ob der aktuelle Hover-Slot während des Item-ziehens frei ist + var actFreeTradeSlot; //Ob der aktuelle TradeInventar-Hover-Slot während des Item-ziehens frei ist + var bufferItem = []; + var stackToItem; //Der Slot zu dem das aktuelle Item gestackt würde, wenn man die Maustaste loslässt + var stackToTradeItem; //Der Handels-Slot zu dem das aktuelle Item gestackt würde, wenn man die Maustaste loslässt + + mp.events.add("showInventory", (invWeight, itemArr) => { + if (show === false) { + //mp.gui.chat.activate(false); + + mp.gui.cursor.show(true, true); + inventoryWeight = invWeight; + items = itemArr; + show = true; + mp.game.graphics.requestStreamedTextureDict("itemimages", true); + } else { + mp.events.callRemote('saveInventory', JSON.stringify(items)); + mp.gui.chat.activate(true); + mp.gui.cursor.show(false, false); + show = false; + syncCount++; + mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("itemimages"); + inventoryWeight = 0; + items = null; + itemRadial = false; + if (tradeItems.length === 0) { + isTrading = false; + } + } + }); + + //Zeigt dem Handelsanfragenden das Handelsinventar + mp.events.add("openTradeMenu", (tradePartnerName) => { + tradePartner = tradePartnerName; + isTrading = true; + }); + + //Zeigt dem Handelspartner das Fenster zur Annahme oder Verweigerung des Handels + mp.events.add("showTradeRequest", () => { + show = false; + }); + + //Zeigt dem Admin das Inventar eines Spielers + mp.events.add("showInventoryToAdmin", (pName, invWeight, itemArr) => { + if (showAdmin === false) { + targetPlayerName = pName; + mp.gui.chat.activate(false); + inventoryWeight = invWeight; + items = itemArr; + mp.game.graphics.requestStreamedTextureDict("itemimages", true); + setTimeout(() => mp.gui.cursor.show(true, true), 100); + showAdmin = true; + } + }); + + //Falls das Inventar aktuell offen ist und ein neues hinzugefügt wird, wird dieses Live angezeigt. + mp.events.add("addItem", (item) => { + if (show) { + items.push(JSON.parse(item)); + } + }); + + //Löscht die Handelsitems beim Handelsanfragenden + mp.events.add("clearTradeItems", () => { + tradeConfirm = false; + tradeItems.splice(0, tradeItems.length); + tradePartner = "Keinem"; + tradePrize = 0; + }); + + + //Zeigt dem Handelspartner die zu handelnden Items unter seinem Inventar an. + mp.events.add("showTradeItems", (tradeResultItemArray) => { + //for (var i = 0; i < tradeResultItemArray.length; i++) { + + // tradeItems.push(tradeResultItemArray[i]); + //} + tradeItems = JSON.parse(tradeResultItemArray); + isTrading = true; + }); + + //Entsperrt beim Handelsanfragenden die Items aus dem Handelsfenster + mp.events.add("unlockTradeItems", () => { + tradeConfirm = false; + tradePartner = "Keinem"; + tradePrize = 0; + }); + + //Falls ein Item administrativ entfernt wird, würde auch dies Live angezeigt. + mp.events.add("removeItem", (userItemId, amount) => { + if (show) { + var arrIndex; + for (var i = 0; i < items.length; i++) { + if (items[i][5] === userItemId) { + arrIndex = i; + } + } + inventoryWeight -= parseInt(items[arrIndex][2]) * amount; + items[arrIndex][3] -= amount; + if (items[arrIndex][3] === 0) { + items.splice(arrIndex, 1); + } + } + }); + + mp.events.add("SERVER:INVENTORY_SYNC", () => { + syncCount--; + }); + + mp.events.add("render", () => { + var pos; + if (show === true) { + pos = mp.gui.cursor.position; + + for (q = 0; q < items.length; q++) { + mp.game.graphics.drawText("[" + items[q][0] + "]" + "[" + items[q][2] + "]" + "[" + items[q][3] + "]" + "[" + items[q][4] + "]" + "[" + items[q][5] + "]", [0.1, 0.4 + qw], { + //mp.game.graphics.drawText("(MOIN)", [0.1, 0.4 + qw], { + font: 4, + color: [255, 255, 255, 254], + scale: [0.4, 0.4], + outline: true, + centre: false + }); + qw += 0.025; + } + + + mp.game.graphics.set2dLayer(1); //# + mp.game.graphics.drawRect(rxC, ryC, 0.45, 0.7, 255, 255, 255, 200); //INVENTARHINTERGRUND + + mp.game.graphics.set2dLayer(2); //## + + //INVENTARÜBERSCHRIFT + mp.game.graphics.drawText("Inventar ~g~" + inventoryWeight + "/40000g", [rxC, ryC - (rWidth / 1.20)], { + font: 7, + color: [112, 128, 144, 254], + scale: [0.7, 0.7], + outline: true, + centre: false + }); + + if (syncCount != 0) { + syncDeg += 3; + if (syncDeg === 360) syncDeg = 0; + + mp.game.graphics.drawText("~s~synchronisiere ~g~ " + syncCount, [rxC + 0.165, ryC - (rWidth / 1.20) + 0.035], { + font: 7, + color: [112, 128, 144, 254], + scale: [0.4, 0.4], + outline: true, + centre: false + }); + mp.game.graphics.drawSprite("itemimages", "refresh", rxC + 0.165, ryC - (rWidth / 1.20) + 0.01, spriteScaleX * 0.4, spriteScaleY * 0.4, syncDeg, 255, 255, 255, 255); + } else { + mp.game.graphics.drawText("~s~synchronisiert", [rxC + 0.165, ryC - (rWidth / 1.20) + 0.035], { + font: 7, + color: [112, 128, 144, 254], + scale: [0.4, 0.4], + outline: true, + centre: false + }); + } + + //SLOTS [RECHTECKE] [SLOTZAHLEN] + + var slots; + var tempSlot; + for (slots = 0; slots < grid.length; slots++) { + mp.game.graphics.drawRect(grid[slots][0], grid[slots][1], sizeMulx, sizeMuly, 112, 128, 144, 254); + mp.game.graphics.drawText(tempSlot = slots + 1, [grid[slots][0] - sizeMulxHalf + 0.006, grid[slots][1] - (sizeMulxHalf * aspectRatioFactor)], { + font: 7, + color: [255, 69, 0, 254], + scale: [0.3, 0.3], + outline: true, + centre: false + }); + } + + mp.game.graphics.set2dLayer(3); //### + + var currentItem; + + //SPRITES + ITEMANZAHL + for (currentItem = 0; currentItem < items.length; currentItem++) { + if (items[currentItem][4] !== "-1") { + mp.game.graphics.drawSprite("itemimages", items[currentItem][0].toLowerCase(), grid[items[currentItem][4] - 1][0], grid[items[currentItem][4] - 1][1], spriteScaleX, spriteScaleY, 0, 255, 255, 255, 255); + mp.game.graphics.drawText("(~y~" + items[currentItem][3] + "~s~)", [grid[items[currentItem][4] - 1][0] + sizeMulxHalf - 0.008, grid[items[currentItem][4] - 1][1] + 0.05], { + font: 0, + color: [255, 255, 255, 255], + scale: [0.25, 0.25], + outline: true, + centre: false + }); + } + } + + var hoverItemP; + + mp.game.graphics.set2dLayer(4); //#### + //WENN MAUS ÜBER ITEM + if (isMouseOverItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) { + mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220); + + hoverItemP = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3]]; + + //NAME + mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.4, 0.4], + outline: true, + centre: false + }); + + //BESCHREIBUNG + mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.35, 0.35], + outline: true, + centre: false + }); + + //EINZELGEWICHT + mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.35, 0.35], + outline: true, + centre: false + }); + } + + //WENN MOUSE DOWN + if (mouseLDown && dragItem !== null || mouseRDown && dragItem !== null) { + + if (isMouseOverFreeSlot(pos[0], pos[1]) || isMouseOverFreeTradeSlot(pos[0], pos[1]) || isItemOverSameItem(pos[0], pos[1]) || isItemOverSameTradeItem(pos[0], pos[1])) { + if (dragTradeItem === false) { + mp.game.graphics.drawSprite("itemimages", items[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, spriteScaleX, spriteScaleY, 0, 100, 255, 100, 255); + } else { + mp.game.graphics.drawSprite("itemimages", tradeItems[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, spriteScaleX, spriteScaleY, 0, 100, 255, 100, 255); + } + } else { + if (dragTradeItem === false) { + mp.game.graphics.drawSprite("itemimages", items[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, spriteScaleX, spriteScaleY, 0, 255, 100, 100, 255); + } else { + mp.game.graphics.drawSprite("itemimages", tradeItems[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, spriteScaleX, spriteScaleY, 0, 255, 100, 100, 255); + } + } + } + mp.game.graphics.set2dLayer(5); //##### + if (itemRadial === true) { + mp.game.graphics.drawSprite("itemimages", "radialsplit", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 0, 0, 0, 255); + mp.game.graphics.drawSprite("itemimages", "radialup", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, upRColor, 222, upRColor); + mp.game.graphics.drawSprite("itemimages", "radialdown", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, downRColor, 222, downRColor); + //mp.game.graphics.drawSprite("itemimages", "radialleft", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, leftRColor, 222, leftRColor); + //mp.game.graphics.drawSprite("itemimages", "radialright", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, rightRColor, 222, rightRColor); + + mp.game.graphics.set2dLayer(6); //###### + mp.game.graphics.drawSprite("itemimages", "radialdrop", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 255, 255, 255, 255); + mp.game.graphics.drawSprite("itemimages", "radialuse", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 255, 255, 255, 255); + } + mp.game.graphics.set2dLayer(7); //####### + + if (ifMouseSelectRadial(pos[0], pos[1])) { + //mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY - 0.02, 0.08, 0.03, 0, 0, 0, 255); + mp.game.graphics.drawText("~g~" + radialDescription, [pos[0] / screenX, pos[1] / screenY - 0.033], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.5, 0.5], + outline: true, + centre: false + }); + } + if (isTrading) { + mp.game.graphics.set2dLayer(1); + mp.game.graphics.drawRect(rxC, 0.925, 0.45, 0.25, 255, 255, 255, 200); + mp.game.graphics.set2dLayer(2); + var tempSlot2; + for (slots = 0; slots < tradeGrid.length; slots++) { + mp.game.graphics.drawRect(tradeGrid[slots][0], tradeGrid[slots][1], sizeMulx, sizeMuly, 112, 128, 144, 254); + mp.game.graphics.drawText(tempSlot2 = slots + 1, [tradeGrid[slots][0] - sizeMulxHalf + 0.006, tradeGrid[slots][1] - (sizeMulxHalf * aspectRatioFactor)], { + font: 7, + color: [69, 255, 0, 254], + scale: [0.3, 0.3], + outline: true, + centre: false + }); + } + + mp.game.graphics.set2dLayer(3); + + //SPRITES + ITEMANZAHL + if (tradeItems.length !== 0) { + for (currentItem = 0; currentItem < tradeItems.length; currentItem++) { + if (tradeItems[currentItem][4] !== "-1") { + mp.game.graphics.drawSprite("itemimages", tradeItems[currentItem][0].toLowerCase(), tradeGrid[tradeItems[currentItem][4] - 1][0], tradeGrid[tradeItems[currentItem][4] - 1][1], spriteScaleX, spriteScaleY, 0, 255, 255, 255, 255); + mp.game.graphics.drawText("(~y~" + tradeItems[currentItem][3] + "~s~)", [tradeGrid[tradeItems[currentItem][4] - 1][0] + sizeMulxHalf - 0.008, tradeGrid[tradeItems[currentItem][4] - 1][1] + 0.05], { + font: 0, + color: [255, 255, 255, 255], + scale: [0.25, 0.25], + outline: true, + centre: false + }); + if (tradeConfirm === true) { + mp.game.graphics.drawSprite("itemimages", "lock", tradeGrid[tradeItems[currentItem][4] - 1][0], tradeGrid[tradeItems[currentItem][4] - 1][1], spriteScaleX / 2, spriteScaleY / 2, 0, 255, 255, 255, 255); + } + } + } + } + //} else { + // if (tradeResultItems.length !== 0) { + // for (var currentItem = 0; currentItem < tradeResultItems.length; currentItem++) { + // mp.game.graphics.drawSprite("itemimages", tradeResultItems[currentItem][0].toLowerCase(), tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][0], tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][1], spriteScaleX, spriteScaleY, 0, 255, 255, 255, 255); + // mp.game.graphics.drawText("(~y~" + tradeResultItems[currentItem][3] + "~s~)", [tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][0] + (sizeMul / 2) - 0.008, tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][1] + 0.05], { + // font: 0, + // color: [255, 255, 255, 255], + // scale: [0.25, 0.25], + // outline: true, + // }); + // } + // } + //} + + mp.game.graphics.drawText("Handel mit ~y~" + tradePartner + " ~s~ für ~g~ " + tradePrize + "$", [rxC, 0.81], { + font: 7, + color: [112, 128, 144, 254], + scale: [0.6, 0.6], + outline: true, + centre: false + }); + mp.game.graphics.set2dLayer(4); + if (tradeConfirm === false) { + mp.game.graphics.drawSprite("itemimages", "box", tradeBoxPos[0], tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255); + } else { + mp.game.graphics.drawSprite("itemimages", "boxticked", tradeBoxPos[0], tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255); + } + mp.game.graphics.drawSprite("itemimages", "dollar", tradeBoxPos[0] - 0.025, tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255); + + if (isMouseOverTradeDollar(pos[0], pos[1])) { + mp.game.graphics.drawText("~g~ Preis festlegen", [pos[0] / screenX, pos[1] / screenY - 0.033], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.5, 0.5], + outline: true, + centre: false + }); + } + if (isMouseOverTradeBox(pos[0], pos[1])) { + mp.game.graphics.drawText("~g~Handelsanfrage absenden", [pos[0] / screenX, pos[1] / screenY - 0.033], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.5, 0.5], + outline: true, + centre: false + }); + } + + mp.game.graphics.set2dLayer(5); + if (isMouseOverTradeItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) { + mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220); + + hoverItemP = [tradeItems[hoverItem][0], tradeItems[hoverItem][1], tradeItems[hoverItem][2], tradeItems[hoverItem][3]]; + + //NAME + mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.4, 0.4], + outline: true, + centre: false + }); + + //BESCHREIBUNG + mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.35, 0.35], + outline: true, + centre: false + }); + + //EINZELGEWICHT + mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.35, 0.35], + outline: true, + centre: false + }); + } + } + + + + ////--------------------------------------------------------------DEBUG + //mp.game.graphics.drawText(itemRadial.toString() + " ~y~" + radialSelect, [0.5, 0.05], { + // font: 7, + // color: [255, 0, 0, 255], + // scale: [0.7, 0.7], + // outline: true, + //}); + ////KOORDINATEN + //mp.game.graphics.drawText((pos[0] / screenX).toFixed(3) + " / " + (pos[1] / screenY).toFixed(3) + " " + tradeItems.length, [pos[0] / screenX, pos[1] / screenY - 0.02], { + // font: 4, + // color: [255, 255, 255, 255], + // scale: [0.4, 0.4], + // outline: true, + //}); + ////----------------------------------------------------------DEBUG END + } + qw = 0; + if (showAdmin === true) { + pos = mp.gui.cursor.position; + + mp.game.graphics.set2dLayer(1); + //INVENTARHINTERGRUND + mp.game.graphics.drawRect(rxC, ryC, 0.45, 0.7, 255, 255, 255, 200); + + mp.game.graphics.set2dLayer(2); + //INVENTARÜBERSCHRIFT + mp.game.graphics.drawText("Inventar von ~y~" + targetPlayerName + " ~g~" + inventoryWeight + "/40000g", [rxC, ryC - (rWidth / 1.20)], { + font: 7, + color: [112, 128, 144, 254], + scale: [0.7, 0.7], + outline: true, + centre: false + }); + + //SLOTS [RECHTECKE] [SLOTZAHLEN] + for (slots = 0; slots < grid.length; slots++) { + mp.game.graphics.drawRect(grid[slots][0], grid[slots][1], sizeMulx, sizeMuly, 112, 128, 144, 254); + mp.game.graphics.drawText(tempSlot = slots + 1, [grid[slots][0] - sizeMulxHalf + 0.006, grid[slots][1] - (sizeMulxHalf * aspectRatioFactor)], { + font: 7, + color: [255, 69, 0, 254], + scale: [0.3, 0.3], + outline: true, + centre: false + }); + } + + mp.game.graphics.set2dLayer(3); + //SPRITES + ITEMANZAHL + for (currentItem = 0; currentItem < items.length; currentItem++) { + if (items[currentItem][4] !== "-1") { + mp.game.graphics.drawSprite("itemimages", items[currentItem][0].toLowerCase(), grid[items[currentItem][4] - 1][0], grid[items[currentItem][4] - 1][1], spriteScaleX, spriteScaleY, 0, 255, 255, 255, 255); + mp.game.graphics.drawText("(~y~" + items[currentItem][3] + "~s~)", [grid[items[currentItem][4] - 1][0] + sizeMulxHalf - 0.008, grid[items[currentItem][4] - 1][1] + 0.05], { + font: 0, + color: [255, 255, 255, 255], + scale: [0.25, 0.25], + outline: true, + centre: false + }); + } + } + + mp.game.graphics.set2dLayer(4); + //WENN MAUS ÜBER ITEM + if (isMouseOverItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) { + mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220); + + hoverItemP = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3]]; + + //NAME + mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.4, 0.4], + outline: true, + centre: false + }); + + //BESCHREIBUNG + mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.35, 0.35], + outline: true, + centre: false + }); + + //EINZELGEWICHT + mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], { + font: 4, + color: [255, 255, 255, 255], + scale: [0.35, 0.35], + outline: true, + centre: false + }); + } + + if (isMouseOverX(pos[0], pos[1])) { + mp.game.graphics.drawSprite("itemimages", "x", closePos[0], closePos[1], 0.02, 0.035, 0, 220, 20, 60, 255); + } else { + mp.game.graphics.drawSprite("itemimages", "x", closePos[0], closePos[1], 0.02, 0.035, 0, 255, 255, 255, 255); + } + + } + }); + + function isMouseOverItem(cX, cY) { + + var x, y, a, b, c, s, invSlot; + x = cX / screenX; + y = cY / screenY; + + if (dragItem === null) { + for (s = 0; s < 20; s++) { + a = grid[s][0] - x; + b = grid[s][1] - y; + c = Math.sqrt(a * a + b * b); + invSlot = (s + 1); + if (c < sizeMulxHalf) { + for (var i = 0; i < items.length; i++) { + if (parseInt(items[i][4]) === invSlot) { + hoverItem = i; + return true; + } + } + } + } + } else { + if (itemRadial === false) { + for (s = 0; s < 20; s++) { + a = grid[s][0] - x; + b = grid[s][1] - y; + c = Math.sqrt(a * a + b * b); + invSlot = (s + 1); + if (c < sizeMulxHalf) { + for (i = 0; i < items.length; i++) { + if (parseInt(items[i][4]) === invSlot) { + hoverGrid = s; + return true; + } + } + } + } + } + } + } + function isMouseOverTradeItem(cX, cY) { + + if (dragItem === null && isTrading) { + + var x = cX / screenX; + var y = cY / screenY; + var a; + var b; + var c; + + for (var s = 0; s < 5; s++) { + a = tradeGrid[s][0] - x; + b = tradeGrid[s][1] - y; + c = Math.sqrt(a * a + b * b); + + var invSlot = (s + 1); + + if (c < sizeMulxHalf) { + for (var i = 0; i < tradeItems.length; i++) { + if (parseInt(tradeItems[i][4]) === invSlot) { + hoverItem = i; + return true; + } + } + } + } + } + } + + function isMouseOverFreeSlot(cX2, cY2) { + + var x = cX2 / screenX; + var y = cY2 / screenY; + var isItemOnSlot = 0; + + for (var s = 0; s < 20; s++) { + var invSlot = (s + 1); + + if (x > grid[s][0] - sizeMulxHalf && x < grid[s][0] + sizeMulxHalf && y > grid[s][1] - sizeMulxHalf * aspectRatioFactor && y < grid[s][1] + sizeMulxHalf * aspectRatioFactor) { + for (var i = 0; i < items.length; i++) { + if (parseInt(items[i][4]) === invSlot) { + isItemOnSlot++; + } + } + if (isItemOnSlot === 0) { + actFreeSlot = s + 1; + return true; + } + } + } + } + + function isMouseOverFreeTradeSlot(cX2, cY2) { + + if (tradeConfirm === false) { + var x = cX2 / screenX; + var y = cY2 / screenY; + var isItemOnSlot = 0; + + for (var s = 0; s < 5; s++) { + var invSlot = (s + 1); + + if (x > tradeGrid[s][0] - sizeMulxHalf && x < tradeGrid[s][0] + sizeMulxHalf && y > tradeGrid[s][1] - sizeMulxHalf * aspectRatioFactor && y < tradeGrid[s][1] + sizeMulxHalf * aspectRatioFactor) { + for (var i = 0; i < tradeItems.length; i++) { + if (parseInt(tradeItems[i][4]) === invSlot) { + isItemOnSlot++; + } + } + if (isItemOnSlot === 0) { + actFreeTradeSlot = s + 1; + return true; + } + } + } + } + } + + function isItemOverSameItem(cX2, cY2) { + + if (dragItem !== null && items.length > 0) { + var x = cX2 / screenX; + var y = cY2 / screenY; + + for (var s = 0; s < 20; s++) { + var invSlot = (s + 1); + + if (x > grid[s][0] - sizeMulxHalf && x < grid[s][0] + sizeMulxHalf && y > grid[s][1] - sizeMulxHalf * aspectRatioFactor && y < grid[s][1] + sizeMulxHalf * aspectRatioFactor) { + + for (var i = 0; i < items.length; i++) { + if (dragTradeItem === false) { + if (items[dragItem][0] === items[i][0] && parseInt(items[i][4]) === invSlot && items[hoverItem][4] !== items[i][4]) { + stackToItem = i; + return true; + } + } else { + if (tradeItems[dragItem][0] === items[i][0] && parseInt(items[i][4]) === invSlot) { + stackToItem = i; + return true; + } + } + } + } + } + } + } + + function isItemOverSameTradeItem(cX2, cY2) { + + if (dragItem !== null && tradeItems.length > 0) { + var x = cX2 / screenX; + var y = cY2 / screenY; + for (var s = 0; s < 5; s++) { + var invSlot = (s + 1); + + if (x > tradeGrid[s][0] - sizeMulxHalf && x < tradeGrid[s][0] + sizeMulxHalf && y > tradeGrid[s][1] - sizeMulxHalf * aspectRatioFactor && y < tradeGrid[s][1] + sizeMulxHalf * aspectRatioFactor) { + + for (var i = 0; i < tradeItems.length; i++) { + if (dragTradeItem === false) { + if (items[dragItem][0] === tradeItems[i][0] && parseInt(tradeItems[i][4]) === invSlot) { + stackToTradeItem = i; + return true; + } + } else { + if (tradeItems[dragItem][0] === tradeItems[i][0] && parseInt(tradeItems[i][4]) === invSlot && tradeItems[hoverItem][4] !== tradeItems[i][4]) { + stackToTradeItem = i; + return true; + } + } + } + } + } + } + } + + function isMouseOverX(cX2, cY2) { + if (showAdmin) { + var x = cX2 / screenX; + var y = cY2 / screenY; + + if (x > closePos[0] - 0.01 && x < closePos[0] + 0.01 && y > closePos[1] - 0.0175 && y < closePos[1] + 0.0175) { + return true; + } + } + } + + function isMouseOverTradeBox(cX2, cY2) { + if (show && tradeConfirm === false) { + var x = cX2 / screenX; + var y = cY2 / screenY; + + if (x > tradeBoxPos[0] - 0.01 && x < tradeBoxPos[0] + 0.01 && y > tradeBoxPos[1] - 0.0175 && y < tradeBoxPos[1] + 0.0175) { + return true; + } + } + } + + function isMouseOverTradeDollar(cX2, cY2) { + if (show && tradeConfirm === false) { + var x = cX2 / screenX; + var y = cY2 / screenY; + + if (x > (tradeBoxPos[0] - 0.025) - 0.01 && x < (tradeBoxPos[0] - 0.025) + 0.01 && y > tradeBoxPos[1] - 0.0175 && y < tradeBoxPos[1] + 0.0175) { + return true; + } + } + } + + function ifMouseSelectRadial(cX2, cY2) { + if (show && itemRadial === true) { + var x = cX2 / screenX; + var y = cY2 / screenY; + var a; + var b; + var c; + + //OBEN + if (x > grid[hoverGrid][0] - 0.0255 / aspectRatioFactor && x < grid[hoverGrid][0] + 0.0255 / aspectRatioFactor && y < grid[hoverGrid][1] - 0.065 && y > grid[hoverGrid][1] - 0.2) { + radialSelect = "up"; + radialDescription = "Wegwerfen"; + upRColor = 255; + return true; + } + //UNTEN + else if (x > grid[hoverGrid][0] - 0.0255 / aspectRatioFactor && x < grid[hoverGrid][0] + 0.0255 / aspectRatioFactor && y > grid[hoverGrid][1] + 0.065 && y < grid[hoverGrid][1] + 0.2) { + radialSelect = "down"; + radialDescription = "Benutzen / Essen"; + downRColor = 255; + return true; + } + ////LINKS + //else if (x > grid[hoverGrid][0] - 0.2 / aspectRatioFactor && x < grid[hoverGrid][0] - 0.065 / aspectRatioFactor && y < grid[hoverGrid][1] + 0.0255 && y > grid[hoverGrid][1] - 0.0255) { + // radialSelect = "left"; + // leftRColor = 255; + // return true; + //} + ////RECHTS + //else if (x < grid[hoverGrid][0] + 0.2 / aspectRatioFactor && x > grid[hoverGrid][0] + 0.065 / aspectRatioFactor && y < grid[hoverGrid][1] + 0.0255 && y > grid[hoverGrid][1] - 0.0255) { + // radialSelect = "right"; + // rightRColor = 255; + // return true; + else { + upRColor = 222; + downRColor = 222; + leftRColor = 222; + rightRColor = 222; + } + } + } + + + //Mausklick Events + mp.events.add('click', (x, y, upOrDown, leftOrRight, relativeX, relativeY, worldPosition, hitEntity) => { + + if (show) { + //LINKE MAUSTASTE + //RUNTER + if (upOrDown === "down" && leftOrRight === "left" && mouseLDown === false && mouseRDown === false) { + + mouseLDown = true; + + //Wenn Maus über grünen Haken + if (isTrading && isMouseOverTradeBox(x, y) && tradePrize > 0) { + tradeConfirm = true; + mp.events.callRemote('sendTradeItemsToPartner', JSON.stringify(tradeItems), tradePrize, tradePartner); + } + + //Wenn Maus über Dollar Zeichen + if (isTrading && isMouseOverTradeDollar(x, y)) { + globalData.InMenu = true; + var tradeMoney = new InputHelper("Wie viel $ möchtest du für deine Items haben?", globalData); + tradeMoney.show(); + tradeMoney.getValue((data) => { + var amount = parseInt(data); + if (isNaN(amount) || amount < 0) { + mp.game.graphics.notify('~r~Du musst eine Zahl größer als 0 eingeben!'); + return; + } + globalData.InMenu = false; + tradePrize = amount; + }); + } + + //Wenn Maus über Item + if (isMouseOverItem(x, y) && dragItem === null && itemRadial === false) { + dragItem = hoverItem; + oldDragSlot = items[dragItem][4]; + items[dragItem][4] = "-1"; + dragTradeItem = false; + } + //wenn Maus über Radialmenü + if (ifMouseSelectRadial(x, y)) { + switch (radialSelect) { + case "up": + var dropInput = new InputHelper("Wie viel Items möchtest du wegwerfen?", globalData); + globalData.InMenu = true; + dropInput.show(); + dropInput.getValue((data) => { + var amount = parseInt(data); + if (isNaN(amount) || amount < 1) { + mp.game.graphics.notify('~r~Du musst eine Zahl größer als 0 eingeben!'); + return; + } else if (amount > parseInt(items[clickedItem][3])) { + mp.game.graphics.notify('~r~So viele Items hast du nicht!'); + return; + } + mp.events.callRemote('itemInteract', "drop", items[clickedItem][5], amount); + }); + globalData.InMenu = false; + itemRadial = false; + break; + case "down": + mp.events.callRemote('itemInteract', "use", items[clickedItem][5], 1); + itemRadial = false; + break; + case "left": + itemRadial = false; + break; + case "right": + itemRadial = false; + break; + } + } + //Wenn Maus über Tradeitem + if (isMouseOverTradeItem(x, y) && dragItem === null && itemRadial === false && tradeConfirm === false) { + dragItem = hoverItem; + oldDragSlot = tradeItems[dragItem][4]; + tradeItems[dragItem][4] = "-1"; + dragTradeItem = true; + } + } + + //HOCH + if (upOrDown === "up" && leftOrRight === "left" && mouseLDown === true && itemRadial === false) { + + mouseLDown = false; + + if (dragItem !== null) { + var newAmount; + + //wenn Maus über freien Slot + if (isMouseOverFreeSlot(x, y)) { + if (dragTradeItem === false) { + items[dragItem][4] = actFreeSlot; + } else { + items.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], tradeItems[dragItem][3], actFreeSlot.toString(), tradeItems[dragItem][5]]); + tradeItems.splice(dragItem, 1); + } + syncCount++; + mp.events.callRemote('saveInventory', JSON.stringify(items)); + oldDragSlot = null; + dragItem = null; + hoverItem = null; + } else if (isItemOverSameItem(x, y)) { + if (dragTradeItem === false) { + newAmount = parseInt(items[stackToItem][3]) + parseInt(items[dragItem][3]); + items[stackToItem][3] = newAmount.toString(); + items[dragItem][4] = "-1"; + } else { + newAmount = parseInt(items[stackToItem][3]) + parseInt(tradeItems[dragItem][3]); + items[stackToItem][3] = newAmount.toString(); + tradeItems.splice(dragItem, 1); + } + syncCount++; + mp.events.callRemote('saveInventory', JSON.stringify(items)); + oldDragSlot = null; + dragItem = null; + hoverItem = null; + } else if (isItemOverSameTradeItem(x, y)) { + if (dragTradeItem === false) { + newAmount = parseInt(tradeItems[stackToTradeItem][3]) + parseInt(items[dragItem][3]); + tradeItems[stackToTradeItem][3] = newAmount.toString(); + items[dragItem][4] = "-1"; + } else { + newAmount = parseInt(tradeItems[stackToTradeItem][3]) + parseInt(tradeItems[dragItem][3]); + tradeItems[stackToTradeItem][3] = newAmount.toString(); + tradeItems[dragItem][4] = "-1"; + } + syncCount++; + mp.events.callRemote('saveInventory', JSON.stringify(items)); + oldDragSlot = null; + dragItem = null; + hoverItem = null; + } else if (isMouseOverFreeTradeSlot(x, y)) { + if (dragTradeItem === false) { + tradeItems.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], items[dragItem][3], actFreeTradeSlot.toString(), items[dragItem][5]]); + items.splice(dragItem, 1); + } else { + tradeItems[dragItem][4] = actFreeTradeSlot; + } + syncCount++; + mp.events.callRemote('saveInventory', JSON.stringify(items)); + oldDragSlot = null; + dragItem = null; + hoverItem = null; + } else { + if (dragTradeItem === false) { + items[dragItem][4] = oldDragSlot; + } else { + tradeItems[dragItem][4] = oldDragSlot; + } + oldDragSlot = null; + dragItem = null; + hoverItem = null; + } + } + } + + //RECHTE MAUSTASTE + //RUNTER + if (upOrDown === "down" && leftOrRight === "right" && mouseLDown === false && mouseRDown === false && itemRadial === false) { + clickTime = Date.now(); + mouseRDown = true; + + if (isMouseOverItem(x, y) && dragItem === null) { + dragItem = hoverItem; + oldDragSlot = items[hoverItem][4]; + bufferItem = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3], items[hoverItem][4], items[hoverItem][5]]; + items[hoverItem][3]--; + dragTradeItem = false; + } else if (isMouseOverTradeItem(x, y) && dragItem === null && tradeConfirm === false) { + dragItem = hoverItem; + oldDragSlot = tradeItems[hoverItem][4]; + bufferItem = [tradeItems[hoverItem][0], tradeItems[hoverItem][1], tradeItems[hoverItem][2], tradeItems[hoverItem][3], tradeItems[hoverItem][4], tradeItems[hoverItem][5]]; + tradeItems[hoverItem][3]--; + dragTradeItem = true; + } + } + + //HOCH + if (upOrDown === "up" && leftOrRight === "right" && mouseRDown === true && itemRadial === false) { + mouseRDown = false; + if (Date.now() - clickTime < 100 && isMouseOverItem(x, y)) { + clickedItem = hoverItem; + items[hoverItem][3]++; + itemRadial = true; + hoverItem = null; + dragItem = null; + clickTime = null; + } else { + if (dragItem !== null) { + if (isMouseOverFreeSlot(x, y)) { + if (dragTradeItem === false) { + items.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], "1", actFreeSlot.toString(), "-1"]); + if (items[hoverItem][3] === 0) { + items[hoverItem][4] = "-1"; + items.splice(hoverItem, 1); + } + } else { + items.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], "1", actFreeSlot.toString(), "-1"]); + if (tradeItems[hoverItem][3] === 0) { + tradeItems.splice(hoverItem, 1); + } + } + syncCount++; + mp.events.callRemote('saveInventory', JSON.stringify(items)); + oldDragSlot = null; + dragItem = null; + hoverItem = null; + } else if (isItemOverSameItem(x, y)) { + items[stackToItem][3]++; + if (dragTradeItem === false) { + if (items[hoverItem][3] === 0) { + items[hoverItem][4] = "-1"; + } + } else { + if (tradeItems[hoverItem][3] === 0) { + tradeItems.splice(hoverItem, 1); + } + } + syncCount++; + mp.events.callRemote('saveInventory', JSON.stringify(items)); + bufferItem = null; + dragItem = null; + hoverItem = null; + oldDragSlot = null; + } else if (isItemOverSameTradeItem(x, y)) { + tradeItems[stackToTradeItem][3]++; + if (dragTradeItem === false) { + if (items[hoverItem][3] === 0) { + items[hoverItem][4] = "-1"; + } + } else { + if (tradeItems[hoverItem][3] === 0) { + tradeItems[hoverItem][4] = "-1"; + } + } + syncCount++; + mp.events.callRemote('saveInventory', JSON.stringify(items)); + oldDragSlot = null; + bufferItem = null; + dragItem = null; + hoverItem = null; + } else if (isMouseOverFreeTradeSlot(x, y)) { + if (dragTradeItem === false) { + tradeItems.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], "1", actFreeTradeSlot.toString(), "-1"]); + if (items[hoverItem][3] === 0) { + items[hoverItem][4] = "-1"; + } + } else { + tradeItems.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], "1", actFreeTradeSlot.toString(), "-1"]); + if (tradeItems[hoverItem][3] === 0) { + tradeItems[hoverItem][4] = "-1"; + } + } + syncCount++; + mp.events.callRemote('saveInventory', JSON.stringify(items)); + oldDragSlot = null; + dragItem = null; + hoverItem = null; + } else { + if (dragTradeItem === false) { + items[hoverItem][3]++; + } else { + tradeItems[hoverItem][3]++; + } + oldDragSlot = null; + bufferItem = null; + dragItem = null; + hoverItem = null; + } + } + } + } + } + if (showAdmin) { + //LINKE MAUSTASTE + //RUNTER + if (upOrDown === "down" && leftOrRight === "left" && mouseLDown === false && mouseRDown === false) { + + if (isMouseOverItem(x, y)) { + items[hoverItem][4] = "-1"; + inventoryWeight -= parseInt(items[hoverItem][2]) * parseInt(items[hoverItem][3]); + mp.events.callRemote('removeItemAsAdmin', "stack", items[hoverItem][5], targetPlayerName); + } else if (isMouseOverX(x, y)) { + mp.gui.chat.activate(true); + mp.gui.cursor.show(false, false); + showAdmin = false; + mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("itemimages"); + inventoryWeight = 0; + items = null; + } + } + + //RECHTE MAUSTASTE + //RUNTER + if (upOrDown === "down" && leftOrRight === "right" && mouseLDown === false && mouseRDown === false) { + + if (isMouseOverItem(x, y)) { + items[hoverItem][3]--; + mp.events.callRemote('removeItemAsAdmin', "one", items[hoverItem][5], targetPlayerName); + if (items[hoverItem][3] === 0) { + items[hoverItem][4] = "-1"; + } + inventoryWeight -= items[hoverItem][2]; + } + } + } + }); +} \ No newline at end of file diff --git a/ReallifeGamemode.Server/Gangwar/Turf.cs b/ReallifeGamemode.Server/Gangwar/Turf.cs index 3000d1ec..b7b46990 100644 --- a/ReallifeGamemode.Server/Gangwar/Turf.cs +++ b/ReallifeGamemode.Server/Gangwar/Turf.cs @@ -114,16 +114,13 @@ namespace ReallifeGamemode.Server.Gangwar this.timerCount = 0; } - private void reloadGangTurfs() + private void ReloadGangTurfs() { - var t = Task.Factory.StartNew(() => + NAPI.Task.Run(() => { - Task.Delay(10000).Wait(); Gangwar.loadTurfs(); Gangwar.loadTurfs_ToAllPlayers(); - }); - t.Wait(); - + }, delayTime: 2000); } private void Tick(object sender, System.Timers.ElapsedEventArgs e) @@ -303,7 +300,7 @@ namespace ReallifeGamemode.Server.Gangwar NAPI.ClientEvent.TriggerClientEventForAll("CLIENT:Turf_Conquered", JsonConvert.SerializeObject(this.TurfID), JsonConvert.SerializeObject(this.status), JsonConvert.SerializeObject(this.Owner)); Gangwar.loadTurfs(); Gangwar.loadTurfs_ToAllPlayers(); - reloadGangTurfs(); + ReloadGangTurfs(); } public void attack(string attacker) From 19357a512b65c4f85fb0b6917a87f1c015da69b7 Mon Sep 17 00:00:00 2001 From: Fabian Wessels Date: Wed, 7 Apr 2021 20:49:43 +0200 Subject: [PATCH 098/116] datum und uhrzeit vertauscht --- ReallifeGamemode.Client/Gui/infobox.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ReallifeGamemode.Client/Gui/infobox.ts b/ReallifeGamemode.Client/Gui/infobox.ts index be4c2555..74f48eeb 100644 --- a/ReallifeGamemode.Client/Gui/infobox.ts +++ b/ReallifeGamemode.Client/Gui/infobox.ts @@ -202,7 +202,7 @@ export default function (globalData: IGlobalData): void { centre: false }) - mp.game.graphics.drawText(dateString + "\n" + timeString, [0.938, 0.381], + mp.game.graphics.drawText(timeString + "\n" + dateString, [0.938, 0.381], { font: 4, color: [255, 255, 255, 255], @@ -219,7 +219,7 @@ export default function (globalData: IGlobalData): void { outline: true, centre: false }) - mp.game.graphics.drawText("~r~Datum: ", [0.89, 0.381], + mp.game.graphics.drawText("~r~Datum: ", [0.891, 0.411], { font: 4, color: [255, 255, 255, 255], @@ -227,7 +227,7 @@ export default function (globalData: IGlobalData): void { outline: true, centre: false }) - mp.game.graphics.drawText("~r~Uhrzeit: ", [0.891, 0.411], + mp.game.graphics.drawText("~r~Uhrzeit: ", [0.89, 0.381], { font: 4, color: [255, 255, 255, 255], From 347f3823a73a3ae2fd8231846acbef129c2fa7c4 Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 21:07:22 +0200 Subject: [PATCH 099/116] Fix animationSync on Cuff Closes #16 --- ReallifeGamemode.Client/util/animationSync.ts | 25 +++++++++---------- .../Extensions/ClientExtension.cs | 2 ++ ReallifeGamemode.Server/Util/AnimationSync.cs | 20 +++++++++++---- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 2270a15d..f98abe12 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -73,7 +73,7 @@ let currentAnim = animationSyncData.animations[index]; let { id, name, animDict, animName, duration, loop, flag } = currentAnim; - if (loop && !player.isPlayingAnim(animDict, animName, 3)) { + if (loop == true && !player.isPlayingAnim(animDict, animName, 3)) { loadAnimDict(animDict, function () { mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) }); @@ -104,22 +104,21 @@ mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) }); - if (mp.players.local == entity && loop) { - animationBreakTimer = setInterval(() => breakAnimation(entity, id), 120000); - } + if (mp.players.local == entity) { + if (loop == true) { + animationBreakTimer = setInterval(() => breakAnimation(id), 120000); + } else { + let a = setInterval(function () { + mp.events.callRemote("CLIENT:ClearAnimationData", true); - if (!loop) { - let a = setInterval(function () { - mp.events.callRemote("CLIENT:ClearAnimationData", entity); - mp.events.callRemote("CLIENT:AnimPairTransition"); - - clearInterval(a); - }, duration); + clearInterval(a); + }, duration); + } } }); - function breakAnimation(entity, id) { - mp.events.callRemote("CLIENT:ClearAnimationData", entity); + function breakAnimation(id) { + mp.events.callRemote("CLIENT:ClearAnimationData", false); let { animName, msg } = animationBreakMessage.find(c => mp.game.joaat(c.animName) == id) if (msg) diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index f6d06d3a..99bdb97a 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -6,6 +6,7 @@ using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Database.Models; +using ReallifeGamemode.Server.Managers; using ReallifeGamemode.Server.Services; using ReallifeGamemode.Server.Types; using ReallifeGamemode.Server.Util; @@ -340,6 +341,7 @@ namespace ReallifeGamemode.Server.Extensions nearestCuffPlayer.AddAttachment("handcuffs", true); player.SyncAnimation("doUncuff"); nearestCuffPlayer.SyncAnimation("getUncuff"); + PositionManager.cuffPoints.Remove(nearestCuffPlayer); } } } diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index d4ae704c..efb0c32d 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -35,11 +35,17 @@ namespace ReallifeGamemode.Server.Util List nextAnimations = animations.Skip(1).ToList(); player.SyncAnimation(animationName); - if (nextAnimations.Count != 0) + if (nextAnimations.Count is 0) { - player.TriggerEvent("SERVER:QueueAnimation", animationName); - animationPair.Add(player, nextAnimations); + animationPair.Remove(player); + return; } + + player.TriggerEvent("SERVER:QueueAnimation", animationName); + if (animationPair.ContainsKey(player)) + animationPair[player] = nextAnimations; + else + animationPair.Add(player, nextAnimations); } /// Check if Player has any Animation playing. @@ -55,6 +61,8 @@ namespace ReallifeGamemode.Server.Util /// Name of requested animation public static bool HasAnimation(this Player player, dynamic animationName) { + string data = player.GetData("Animation"); + bool x = player.GetData("Animation") == animationName; return player.HasData("Animation") && (player.GetData("Animation") == animationName); } @@ -82,9 +90,11 @@ namespace ReallifeGamemode.Server.Util } [RemoteEvent("CLIENT:ClearAnimationData")] - public void ClearAnimationData(Player player, Player target) + public void ClearAnimationData(Player player, bool checkTransition) { - target.ClearAnimation(); + player.ClearAnimation(); + if (checkTransition) + AnimPairTransition(player); } [ServerEvent(Event.PlayerWeaponSwitch)] From c9452c0fca896bf4ff8485d5ba7cfc7a7639622a Mon Sep 17 00:00:00 2001 From: Fabian Wessels Date: Wed, 7 Apr 2021 21:20:34 +0200 Subject: [PATCH 100/116] sigas mangelnde deutschkenntnisse korrigiert --- ReallifeGamemode.Server/Managers/InventoryManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Managers/InventoryManager.cs b/ReallifeGamemode.Server/Managers/InventoryManager.cs index c8befc54..c8a88470 100644 --- a/ReallifeGamemode.Server/Managers/InventoryManager.cs +++ b/ReallifeGamemode.Server/Managers/InventoryManager.cs @@ -74,7 +74,7 @@ namespace ReallifeGamemode.Server.Managers { if (player.IsInVehicle) { - player.TriggerEvent("Error", "Du kannst dein Kofferraum nicht betätigen."); + player.TriggerEvent("Error", "Du kannst deinen Kofferraum gerade nicht öffnen."); } Vehicle veh = NAPI.Pools.GetAllVehicles().ToList().Where(v => v.Position.DistanceTo(player.Position) <= 2).FirstOrDefault(); if (veh == null) From e93db47d8e07cc149f9940f247cd842c988c7c79 Mon Sep 17 00:00:00 2001 From: Fabian Wessels Date: Wed, 7 Apr 2021 21:49:47 +0200 Subject: [PATCH 101/116] sanitaeter koennen onduty keine sanitaeter rufen --- ReallifeGamemode.Client/Login/main.ts | 3 +++ ReallifeGamemode.Server/Managers/InteractionManager.cs | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/Login/main.ts b/ReallifeGamemode.Client/Login/main.ts index 3fe6e020..c0aa02b1 100644 --- a/ReallifeGamemode.Client/Login/main.ts +++ b/ReallifeGamemode.Client/Login/main.ts @@ -51,6 +51,9 @@ export default function (globalData: IGlobalData): void { }); mp.events.add('CEF:Login_RegisterRequest', (password: string) => { + if (password.length < 6) { + return; + } mp.events.callRemote('CLIENT:Login_RegisterRequest', password); }); diff --git a/ReallifeGamemode.Server/Managers/InteractionManager.cs b/ReallifeGamemode.Server/Managers/InteractionManager.cs index 5072f79c..b6542171 100644 --- a/ReallifeGamemode.Server/Managers/InteractionManager.cs +++ b/ReallifeGamemode.Server/Managers/InteractionManager.cs @@ -809,7 +809,7 @@ namespace ReallifeGamemode.Server.Managers [RemoteEvent("CLIENT:InteractionMenu_CallService_Sani")] public void CallServiceSani(Player player) { - if (player.GetUser().FactionId == 2) + if (player.GetUser().FactionId == 2 && player.IsDuty()) { player.SendNotification("~r~[Fehler] ~w~Du kannst keinen Sanitäter rufen."); return; From dffe845a954c3c6a9a5540ed458f7277fd3a796b Mon Sep 17 00:00:00 2001 From: Fabian Wessels Date: Wed, 7 Apr 2021 21:57:25 +0200 Subject: [PATCH 102/116] passwort muss aus mindestens 6 zeichen bestehen --- ReallifeGamemode.Client/Login/main.ts | 3 --- ReallifeGamemode.Server/Events/Register.cs | 9 ++++++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ReallifeGamemode.Client/Login/main.ts b/ReallifeGamemode.Client/Login/main.ts index c0aa02b1..3fe6e020 100644 --- a/ReallifeGamemode.Client/Login/main.ts +++ b/ReallifeGamemode.Client/Login/main.ts @@ -51,9 +51,6 @@ export default function (globalData: IGlobalData): void { }); mp.events.add('CEF:Login_RegisterRequest', (password: string) => { - if (password.length < 6) { - return; - } mp.events.callRemote('CLIENT:Login_RegisterRequest', password); }); diff --git a/ReallifeGamemode.Server/Events/Register.cs b/ReallifeGamemode.Server/Events/Register.cs index 3a18f8a7..28ecacc0 100644 --- a/ReallifeGamemode.Server/Events/Register.cs +++ b/ReallifeGamemode.Server/Events/Register.cs @@ -20,11 +20,18 @@ namespace ReallifeGamemode.Server.Events string username = player.Name; using (var dbContext = new DatabaseContext()) { + if (password.Length < 6) + { + player.TriggerEvent("SERVER:Login_Error", "Das Passwort muss aus mindestens 6 Zeichen bestehen."); + return; + } if (dbContext.Users.Where(u => u.SocialClubName == player.SocialClubName).Count() >= 3) { player.TriggerEvent("SERVER:Login_Error", "Es sind schon 3 Konten mit dieser Socialclub-ID registriert."); + return; } - else if (!dbContext.Users.Any(u => u.Name.ToLower() == username.ToLower().Trim())) + + if (!dbContext.Users.Any(u => u.Name.ToLower() == username.ToLower().Trim())) { var user = new User { From 26fa0ba2aafe9f2df71abff79e5129fae461b334 Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 21:58:36 +0200 Subject: [PATCH 103/116] Done Closes #15, #13 --- ReallifeGamemode.Client/util/animationSync.ts | 40 ++++++++++--------- .../Commands/UserCommands.cs | 6 +-- .../Events/EnterVehicleAttempt.cs | 11 ++--- ReallifeGamemode.Server/Events/Key.cs | 14 +------ .../Extensions/ClientExtension.cs | 17 ++++++++ ReallifeGamemode.Server/Util/AnimationSync.cs | 4 ++ 6 files changed, 49 insertions(+), 43 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index f98abe12..22b39721 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -1,15 +1,17 @@ -export default function animationSync() { +import { debug } from "util"; + +export default function animationSync() { let blockInput = false; let animationBreakTimer; mp.events.add("SERVER:LoadAnimations", () => { - animationSyncData.register("Cuffed", "mp_arresting", "idle", -1, true, 50); - animationSyncData.register("doArrest", "mp_arrest_paired", "cop_p2_back_right", 3760, false, 0); - animationSyncData.register("getArrest", "mp_arrest_paired", "crook_p2_back_right", 3760, false, 0); - animationSyncData.register("doUncuff", "mp_arresting", "a_uncuff", 5500, false, 0); - animationSyncData.register("getUncuff", "mp_arresting", "b_uncuff", 5500, false, 0); - animationSyncData.register("hup", "mp_am_hold_up", "handsup_base", -1, true, 50); - animationSyncData.register("carryBox", "anim@heists@box_carry@", "idle", -1, true, 50); + animationSyncData.register("Cuffed", "mp_arresting", "idle", -1, true, 50, false); + animationSyncData.register("doArrest", "mp_arrest_paired", "cop_p2_back_right", 3760, false, 0, false); + animationSyncData.register("getArrest", "mp_arrest_paired", "crook_p2_back_right", 3760, false, 0, false); + animationSyncData.register("doUncuff", "mp_arresting", "a_uncuff", 5500, false, 0, false); + animationSyncData.register("getUncuff", "mp_arresting", "b_uncuff", 5500, false, 0, false); + animationSyncData.register("hup", "mp_am_hold_up", "handsup_base", -1, true, 50, true); + animationSyncData.register("carryBox", "anim@heists@box_carry@", "idle", -1, true, 50, true); }); const animationBreakMessage = [ @@ -20,7 +22,7 @@ { animations: [], - register: function (name, animDict, animName, duration, loop, flag) { + register: function (name, animDict, animName, duration, loop, flag, endless) { let id = mp.game.joaat(name); if (!this.animations.hasOwnProperty(id)) { @@ -32,7 +34,8 @@ animName: animName, duration: duration, loop: loop, - flag: flag + flag: flag, + endless: endless }; } else { mp.game.graphics.notify("Animation Sync Error: ~r~Duplicate Entry"); @@ -98,34 +101,35 @@ let animData = animationSyncData.animations[index]; - let { id, name, animDict, animName, duration, loop, flag } = animData; + let { id, name, animDict, animName, duration, loop, flag, endless } = animData; loadAnimDict(animDict, function () { mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) }); + if (!endless) { + animationBreakTimer = setInterval(() => breakAnimation(name), 120000); + } if (mp.players.local == entity) { - if (loop == true) { - animationBreakTimer = setInterval(() => breakAnimation(id), 120000); - } else { + if (!loop) { let a = setInterval(function () { mp.events.callRemote("CLIENT:ClearAnimationData", true); clearInterval(a); }, duration); - } + } } }); - function breakAnimation(id) { - mp.events.callRemote("CLIENT:ClearAnimationData", false); - let { animName, msg } = animationBreakMessage.find(c => mp.game.joaat(c.animName) == id) + function breakAnimation(name) { + let { animName, msg } = animationBreakMessage.find(c => c.animName == name) if (msg) mp.events.call("renderTextOnScreen", msg); clearInterval(animationBreakTimer); animationBreakTimer = null; + mp.events.callRemote("CLIENT:ClearAnimationData", false); } mp.events.add("render", () => { diff --git a/ReallifeGamemode.Server/Commands/UserCommands.cs b/ReallifeGamemode.Server/Commands/UserCommands.cs index 6880fd52..d4dde10e 100644 --- a/ReallifeGamemode.Server/Commands/UserCommands.cs +++ b/ReallifeGamemode.Server/Commands/UserCommands.cs @@ -106,11 +106,7 @@ namespace ReallifeGamemode.Server.Commands [Command("hup")] public void CmdAnim(Player player) { - if (player.HasAnimation("hup")) { player.ClearAnimation(); return; } - if (player.HasAnimation()) - return; - - player.SyncAnimation("hup"); + player.ToggleSurrender(); } [Command("event", "~m~Benutzung: ~s~/event [Nachricht]", GreedyArg = true)] diff --git a/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs b/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs index 46e58036..b63b7661 100644 --- a/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs +++ b/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs @@ -15,17 +15,15 @@ namespace ReallifeGamemode.Server.Events public class EnterVehicleAttempt : Script { public static GTANetworkAPI.Vehicle Roller; + [ServerEvent(Event.PlayerEnterVehicleAttempt)] public void OnPlayerEnterVehicleAttempt(Player player, GTANetworkAPI.Vehicle vehicle, sbyte seat) { - if ((VehicleHash)vehicle.Model == VehicleHash.Dune3) - { - if (seat == 1) seat = 0; - else if (seat == 0) seat = 1; - } - if (seat != 0) return; + if (player.HasAnimation()) + player.StopAnimation(); + User u = player.GetUser(); if (vehicle.GetServerVehicle() is FactionVehicle veh) @@ -84,7 +82,6 @@ namespace ReallifeGamemode.Server.Events return; } } - } if (vehicle.GetServerVehicle() is SchoolVehicle sVeh) { diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 1643b7ac..8cba9c05 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -974,19 +974,7 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("keyPress:ControllH")] public void KeyPressControllH(Player player) { - if (player.HasAnimation("hup")) - { - PositionManager.cuffPoints.Remove(player); - player.ClearAnimation(); - return; - } - if (player.HasAnimation()) - return; - - player.SyncAnimation("hup"); - - if (player.GetUser().Wanteds > 0) - PositionManager.cuffPoints.Add(player); + player.ToggleSurrender(); } #endregion User Key diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index 99bdb97a..42305180 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -344,5 +344,22 @@ namespace ReallifeGamemode.Server.Extensions PositionManager.cuffPoints.Remove(nearestCuffPlayer); } } + + public static void ToggleSurrender(this Player player) + { + if (player.HasAnimation("hup")) + { + PositionManager.cuffPoints.Remove(player); + player.ClearAnimation(); + return; + } + if (player.HasAnimation()) + return; + + player.SyncAnimation("hup"); + + if (player.GetUser().Wanteds > 0) + PositionManager.cuffPoints.Add(player); + } } } diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index efb0c32d..6d10d672 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -13,6 +13,9 @@ namespace ReallifeGamemode.Server.Util public static void SyncAnimation(this Player player, dynamic animationName) { + if (player.IsInVehicle) + return; + if (!player.HasData("Animation")) player.SetData("Animation", String.Empty); @@ -71,6 +74,7 @@ namespace ReallifeGamemode.Server.Util if (!player.HasData("Animation")) return; + player.ClearAttachments(); player.ResetData("Animation"); player.ResetSharedData("AnimationData"); } From 33a16ac17401bc3eae648352d3c9711334e035de Mon Sep 17 00:00:00 2001 From: VegaZ Date: Wed, 7 Apr 2021 22:04:43 +0200 Subject: [PATCH 104/116] Change Medic Overtime Pay / 4 --- ReallifeGamemode.Server/Factions/Medic/Medic.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Factions/Medic/Medic.cs b/ReallifeGamemode.Server/Factions/Medic/Medic.cs index 1f12a5a3..31d900a7 100644 --- a/ReallifeGamemode.Server/Factions/Medic/Medic.cs +++ b/ReallifeGamemode.Server/Factions/Medic/Medic.cs @@ -259,7 +259,7 @@ namespace ReallifeGamemode.Server.Factions.Medic using var dbContext = new DatabaseContext(); { dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 2).First().BankAccount.Balance += Medic.ReviveIncome / 2; - player.SendNotification($"Du hast den Einsatzort erreicht und ~g~{Medic.ReviveIncome / 2}$ ~s~für die Fraktion verdient."); + player.SendNotification($"Du hast den Einsatzort erreicht und ~g~{Medic.ReviveIncome / 4}$ ~s~für die Fraktion verdient."); Medic.delReviveTaskMedic(player); dbContext.SaveChanges(); } From 629cc35e0013193087a9ac3bd634cbf9a581d83a Mon Sep 17 00:00:00 2001 From: VegaZ Date: Wed, 7 Apr 2021 22:18:13 +0200 Subject: [PATCH 105/116] Jetz aber Medic / 4 --- ReallifeGamemode.Server/Factions/Medic/Medic.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Factions/Medic/Medic.cs b/ReallifeGamemode.Server/Factions/Medic/Medic.cs index 31d900a7..41447614 100644 --- a/ReallifeGamemode.Server/Factions/Medic/Medic.cs +++ b/ReallifeGamemode.Server/Factions/Medic/Medic.cs @@ -258,7 +258,7 @@ namespace ReallifeGamemode.Server.Factions.Medic { using var dbContext = new DatabaseContext(); { - dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 2).First().BankAccount.Balance += Medic.ReviveIncome / 2; + dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 2).First().BankAccount.Balance += Medic.ReviveIncome / 4; player.SendNotification($"Du hast den Einsatzort erreicht und ~g~{Medic.ReviveIncome / 4}$ ~s~für die Fraktion verdient."); Medic.delReviveTaskMedic(player); dbContext.SaveChanges(); From f6872c0cbcd001718c8ec76be5311242f29a15ea Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 22:20:38 +0200 Subject: [PATCH 106/116] open #16 --- ReallifeGamemode.Client/util/animationSync.ts | 11 ++++++----- ReallifeGamemode.Server/Util/AnimationSync.cs | 3 --- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/ReallifeGamemode.Client/util/animationSync.ts b/ReallifeGamemode.Client/util/animationSync.ts index 22b39721..169a070b 100644 --- a/ReallifeGamemode.Client/util/animationSync.ts +++ b/ReallifeGamemode.Client/util/animationSync.ts @@ -106,16 +106,17 @@ export default function animationSync() { loadAnimDict(animDict, function () { mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1) }); - if (!endless) { - animationBreakTimer = setInterval(() => breakAnimation(name), 120000); - } if (mp.players.local == entity) { + if (!endless) { + animationBreakTimer = setInterval(() => breakAnimation(name), 120000); + } + if (!loop) { let a = setInterval(function () { - mp.events.callRemote("CLIENT:ClearAnimationData", true); - clearInterval(a); + mp.game.wait(500); + mp.events.callRemote("CLIENT:ClearAnimationData", true); }, duration); } } diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index 6d10d672..827c83aa 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -64,8 +64,6 @@ namespace ReallifeGamemode.Server.Util /// Name of requested animation public static bool HasAnimation(this Player player, dynamic animationName) { - string data = player.GetData("Animation"); - bool x = player.GetData("Animation") == animationName; return player.HasData("Animation") && (player.GetData("Animation") == animationName); } @@ -74,7 +72,6 @@ namespace ReallifeGamemode.Server.Util if (!player.HasData("Animation")) return; - player.ClearAttachments(); player.ResetData("Animation"); player.ResetSharedData("AnimationData"); } From a63185768c9e1e141563df78d366f08b4bc6f919 Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 22:29:47 +0200 Subject: [PATCH 107/116] Fix #16 --- ReallifeGamemode.Server/Util/AnimationSync.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ReallifeGamemode.Server/Util/AnimationSync.cs b/ReallifeGamemode.Server/Util/AnimationSync.cs index 827c83aa..274871b9 100644 --- a/ReallifeGamemode.Server/Util/AnimationSync.cs +++ b/ReallifeGamemode.Server/Util/AnimationSync.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using GTANetworkAPI; using Newtonsoft.Json; +using ReallifeGamemode.Server.Managers; namespace ReallifeGamemode.Server.Util { @@ -95,7 +96,14 @@ namespace ReallifeGamemode.Server.Util { player.ClearAnimation(); if (checkTransition) + { AnimPairTransition(player); + } + else + { + player.ClearAttachments(); + PositionManager.cuffPoints.Remove(player); + } } [ServerEvent(Event.PlayerWeaponSwitch)] From a070f7b74af3c429f4464d3ddd2007792339e4e0 Mon Sep 17 00:00:00 2001 From: Fabian Wessels Date: Wed, 7 Apr 2021 22:30:15 +0200 Subject: [PATCH 108/116] =?UTF-8?q?wichtige=20infos=20zugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReallifeGamemode.Server/Events/Key.cs | 2 +- ReallifeGamemode.Server/Events/Register.cs | 2 +- ReallifeGamemode.Server/Managers/InteractionManager.cs | 2 +- ReallifeGamemode.Server/Managers/InventoryManager.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 8cba9c05..134f7a62 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -21,7 +21,7 @@ using ReallifeGamemode.Server.WeaponDeal; /** * @overview Life of German Reallife - Event Key (Key.cs) -* @author VegaZ +* @author VegaZ, balbo * @copyright (c) 2008 - 2018 Life of German */ diff --git a/ReallifeGamemode.Server/Events/Register.cs b/ReallifeGamemode.Server/Events/Register.cs index 28ecacc0..b7640f91 100644 --- a/ReallifeGamemode.Server/Events/Register.cs +++ b/ReallifeGamemode.Server/Events/Register.cs @@ -6,7 +6,7 @@ using ReallifeGamemode.Database.Models; /** * @overview Life of German Reallife - Event Register (Register.cs) -* @author VegaZ +* @author VegaZ, balbo * @copyright (c) 2008 - 2018 Life of German */ diff --git a/ReallifeGamemode.Server/Managers/InteractionManager.cs b/ReallifeGamemode.Server/Managers/InteractionManager.cs index b6542171..b1c04dfc 100644 --- a/ReallifeGamemode.Server/Managers/InteractionManager.cs +++ b/ReallifeGamemode.Server/Managers/InteractionManager.cs @@ -19,7 +19,7 @@ using ReallifeGamemode.Server.Factions.Medic; /** * @overview Life of German Reallife - Managers Interaction (InteractionManager.cs) -* @author VegaZ +* @author VegaZ, balbo * @copyright (c) 2008 - 2018 Life of German */ diff --git a/ReallifeGamemode.Server/Managers/InventoryManager.cs b/ReallifeGamemode.Server/Managers/InventoryManager.cs index c8a88470..36525511 100644 --- a/ReallifeGamemode.Server/Managers/InventoryManager.cs +++ b/ReallifeGamemode.Server/Managers/InventoryManager.cs @@ -18,7 +18,7 @@ using ReallifeGamemode.Server.Types; /** * @overview Life of German Reallife - Managers InventoryManager (InventoryManager.cs) -* @author hydrant, VegaZ +* @author hydrant, VegaZ, balbo * @copyright (c) 2008 - 2018 Life of German */ From 56ab0734ee71fb7d9b56e278caa0e0adf9b6a89f Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 7 Apr 2021 22:42:57 +0200 Subject: [PATCH 109/116] fix postitioning of cuffs and delete cuffpoits on death --- .../util/attachmentMngr.ts | 2 +- ReallifeGamemode.Server/Events/Death.cs | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ReallifeGamemode.Client/util/attachmentMngr.ts b/ReallifeGamemode.Client/util/attachmentMngr.ts index a19df0ba..bb62ee5d 100644 --- a/ReallifeGamemode.Client/util/attachmentMngr.ts +++ b/ReallifeGamemode.Client/util/attachmentMngr.ts @@ -8,7 +8,7 @@ export default function attachmentManager(game: IGame) { attachmentMngr.register("weapondeal", "ex_prop_crate_ammo_bc", "chassis_dummy", new mp.Vector3(0.08, -0.9, -0.2), new mp.Vector3(0, 0, 0)); attachmentMngr.register("weapondeal1", "ex_office_swag_guns02", "chassis_dummy", new mp.Vector3(0, 0.8, 0), new mp.Vector3(0, 0, 0)); attachmentMngr.register("weapondeal2", "w_sg_pumpshotgun", "chassis_dummy", new mp.Vector3(0.4, 1.6, 0.62), new mp.Vector3(90, 0, 180)); - attachmentMngr.register("handcuffs", "p_cs_cuffs_02_s", 28422, new mp.Vector3(0, 0, 0), new mp.Vector3(0, 90, 0)); + attachmentMngr.register("handcuffs", "p_cs_cuffs_02_s", 28422, new mp.Vector3(-0.05, 0, 0), new mp.Vector3(90, 90, 0)); }); const attachmentMngr = diff --git a/ReallifeGamemode.Server/Events/Death.cs b/ReallifeGamemode.Server/Events/Death.cs index b4edee69..fe1db994 100644 --- a/ReallifeGamemode.Server/Events/Death.cs +++ b/ReallifeGamemode.Server/Events/Death.cs @@ -25,27 +25,29 @@ namespace ReallifeGamemode.Server.Events public class Death : Script { [ServerEvent(Event.PlayerDeath)] - public void OnPlayerDeath(Player player, Player killer, uint reason ) + public void OnPlayerDeath(Player player, Player killer, uint reason) { if (!player.IsLoggedIn()) { player.Kick(); return; } - + + PositionManager.cuffPoints.Remove(player); + player.SetData("isDead", true); - using (var userDeath = new DatabaseContext()) - { + { User userisdead = player.GetUser(userDeath); userisdead.Dead = true; - userDeath.SaveChanges(); - } + userDeath.SaveChanges(); + } //TODO: Zum Full Release entfernen - if (player.HasData("togdeath")) { - ChatService.SendMessage(player, "Du bist durch " + (killer?.Name ?? "Niemanden") + " gestorben: " + reason.ToString()); + if (player.HasData("togdeath")) + { + ChatService.SendMessage(player, "Du bist durch " + (killer?.Name ?? "Niemanden") + " gestorben: " + reason.ToString()); } int? killerId; float killerPosX; @@ -108,8 +110,6 @@ namespace ReallifeGamemode.Server.Events Medic.delHealTask(player); ChatService.BroadcastFaction("~y~[MEDIC] ~w~" + player.Name + " ist soeben verstorben.", new List() { 2 }); } - - if (player.GetUser().IsAdmin(AdminLevel.ADMIN) == true) { From 3f2cdbeea86c92e0721c01cf59d22afeee2adbbd Mon Sep 17 00:00:00 2001 From: hydrant Date: Wed, 7 Apr 2021 23:32:52 +0200 Subject: [PATCH 110/116] maybe fix knast --- ReallifeGamemode.Server/Events/Death.cs | 73 ++++----- ReallifeGamemode.Server/Events/Login.cs | 3 +- ReallifeGamemode.Server/Events/Register.cs | 1 + .../Extensions/ClientExtension.cs | 76 +++++++-- ReallifeGamemode.Server/Finance/Economy.cs | 2 +- ReallifeGamemode.Server/Wanted/Jail.cs | 148 +++++------------- .../Wanted/WantedEscapeTimer.cs | 29 +--- 7 files changed, 148 insertions(+), 184 deletions(-) diff --git a/ReallifeGamemode.Server/Events/Death.cs b/ReallifeGamemode.Server/Events/Death.cs index fe1db994..8cd14748 100644 --- a/ReallifeGamemode.Server/Events/Death.cs +++ b/ReallifeGamemode.Server/Events/Death.cs @@ -33,17 +33,12 @@ namespace ReallifeGamemode.Server.Events return; } + using var dbContext = new DatabaseContext(); + + User user = player.GetUser(dbContext); + PositionManager.cuffPoints.Remove(player); - player.SetData("isDead", true); - - using (var userDeath = new DatabaseContext()) - { - User userisdead = player.GetUser(userDeath); - userisdead.Dead = true; - userDeath.SaveChanges(); - } - //TODO: Zum Full Release entfernen if (player.HasData("togdeath")) { @@ -88,10 +83,25 @@ namespace ReallifeGamemode.Server.Events } } - User user = player.GetUser(); + bool copNearby = NAPI.Pools.GetAllPlayers().Any(u => u.IsDuty() && u.IsAlive() && u.Position.DistanceToSquared(player.Position) <= 200 * 200); + + if (copNearby) + { + user.SetJailTime(true); + Jail.Check_PutBehindBars(user); + ChatService.HQMessage(user.Name + " wurde ins Gefängnis eingeliefert."); + } + else + { + ChatService.HQMessage(user.Name + " wurde soeben ins Krankenhaus eingeliefert."); + } if (user.JailTime <= 0) { + player.SetData("isDead", true); + + user.Dead = true; + if (!player.HasData("reviveSperre")) { //MEDIC AUFTRAG @@ -123,32 +133,28 @@ namespace ReallifeGamemode.Server.Events //TODO PICTURE NOTIFICATION + SOUND für Medics player.ClearAttachments(); - - using (var userDeath = new DatabaseContext()) + List fItem = dbContext.UserItems.Where(u => u.UserId == user.Id).ToList(); + foreach (var item in fItem) { - List fItem = userDeath.UserItems.Where(u => u.UserId == user.Id).ToList(); - foreach (var item in fItem) + IItem iItem = InventoryManager.GetItemById(item.ItemId); + if (iItem is IWeaponDealItem obj) { - IItem iItem = InventoryManager.GetItemById(item.ItemId); - if (iItem is IWeaponDealItem obj) - { - int amount = item.Amount; + int amount = item.Amount; - Vector3 dropPosition = PlayerExtension.GetPositionFromPlayer(player, 0.6f, 0); - //new Vector3(player.Position.X, player.Position.Y, player.Position.Z - 0.8f); - Random r = new Random(); - GTANetworkAPI.Object grndObject; - Vector3 textPos = dropPosition; + Vector3 dropPosition = PlayerExtension.GetPositionFromPlayer(player, 0.6f, 0); + //new Vector3(player.Position.X, player.Position.Y, player.Position.Z - 0.8f); + Random r = new Random(); + GTANetworkAPI.Object grndObject; + Vector3 textPos = dropPosition; - dropPosition.Z -= 1.05f; - grndObject = NAPI.Object.CreateObject(3666746839, dropPosition, new Vector3(0, 0, r.Next(0, 360)), 255, 0); + dropPosition.Z -= 1.05f; + grndObject = NAPI.Object.CreateObject(3666746839, dropPosition, new Vector3(0, 0, r.Next(0, 360)), 255, 0); - GroundItem grndItem = new GroundItem { ItemId = iItem.Id, Amount = amount, Position = dropPosition }; - TextLabel grndTxtLbl = NAPI.TextLabel.CreateTextLabel(iItem.Name + " ~s~(~y~" + amount + "~s~)", textPos, 5, 0.5f, 4, new Color(255, 255, 255), false, 0); - GroundItem.AddGroundItem(grndItem, grndObject, grndTxtLbl); + GroundItem grndItem = new GroundItem { ItemId = iItem.Id, Amount = amount, Position = dropPosition }; + TextLabel grndTxtLbl = NAPI.TextLabel.CreateTextLabel(iItem.Name + " ~s~(~y~" + amount + "~s~)", textPos, 5, 0.5f, 4, new Color(255, 255, 255), false, 0); + GroundItem.AddGroundItem(grndItem, grndObject, grndTxtLbl); - userDeath.Remove(item); - } + dbContext.Remove(item); } var dead = new Database.Entities.Logs.Death @@ -165,8 +171,8 @@ namespace ReallifeGamemode.Server.Events VictimHeading = player.Heading, CauseOfDeath = reason.ToString() }; - userDeath.DeathLogs.Add(dead); - userDeath.SaveChanges(); + dbContext.DeathLogs.Add(dead); + dbContext.SaveChanges(); } } Job.JobBase job = Managers.JobManager.GetJob(player.GetUser().JobId ?? -1); @@ -219,9 +225,6 @@ namespace ReallifeGamemode.Server.Events //ChatService.SendMessage(player, "Debug10"); } } - - //JailTime.cs - Jail.Check_PutBehindBars(player); } [RemoteEvent("RespawnPlayerAtHospital")] diff --git a/ReallifeGamemode.Server/Events/Login.cs b/ReallifeGamemode.Server/Events/Login.cs index ccdd6628..1da5ec9f 100644 --- a/ReallifeGamemode.Server/Events/Login.cs +++ b/ReallifeGamemode.Server/Events/Login.cs @@ -54,6 +54,7 @@ namespace ReallifeGamemode.Server.Events } else { + player.SetData("dbId", user.Id); player.Name = username; player.TriggerEvent("SERVER:Login_Success"); player.TriggerEvent("CLIENT:StopSound"); @@ -122,7 +123,7 @@ namespace ReallifeGamemode.Server.Events } else { - Jail.Check_PutBehindBars(player); + Jail.Check_PutBehindBars(user); } } diff --git a/ReallifeGamemode.Server/Events/Register.cs b/ReallifeGamemode.Server/Events/Register.cs index b7640f91..8536642b 100644 --- a/ReallifeGamemode.Server/Events/Register.cs +++ b/ReallifeGamemode.Server/Events/Register.cs @@ -51,6 +51,7 @@ namespace ReallifeGamemode.Server.Events dbContext.Users.Add(user); dbContext.SaveChanges(); + player.SetData("dbId", user.Id); player.TriggerEvent("SERVER:Login_Success"); player.TriggerEvent("CLIENT:StopSound"); player.SetData("isLoggedIn", true); diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index 42305180..a1d4d914 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -59,6 +59,34 @@ namespace ReallifeGamemode.Server.Extensions } } + public static void SetJailTime(this User user, bool killed) + { + if (user == null) + { + return; + } + + int time = 26 * user.Wanteds; + if (killed) + { + time *= 2; + } + + user.Wanteds = 0; + user.JailTime = time; + } + + public static void AnnouncePlayerJailedIn(this User user) + { + if (user == null) + { + return; + } + string message = user.Name + " wurde ins Gefängnis geliefert"; + + ChatService.HQMessage(message); + } + /// /// Gibt zurück, ob ein Player eingeloggt ist /// @@ -76,8 +104,35 @@ namespace ReallifeGamemode.Server.Extensions public static bool IsDuty(this Player player) { - var user = player.GetUser(); - return user.GetData("duty", false); + return player.GetServerData("duty", false); + } + + public static bool IsAlive(this Player player) + { + return !player.HasData("isDead") || (bool)player.GetData("isDead") == false; + } + + public static T GetServerData(this Player player, string key, T defaultValue = default) + { + if (player == null) + { + return default; + } + + key += "data_"; + if (!player.HasData(key)) return defaultValue; + return JsonConvert.DeserializeObject(player.GetData(key)); + } + + public static void SetServerData(this Player player, string key, object value) + { + if (player == null) + { + return; + } + + key += "data_"; + player.SetData(key, JsonConvert.SerializeObject(value)); } public static bool IsAdminDuty(this Player player) @@ -98,27 +153,14 @@ namespace ReallifeGamemode.Server.Extensions internal static T GetData(this User user, string key, T nullValue) { - if (user == null) - { - return default; - } - - key += "data_"; - if (!user.Player.HasData(key)) return nullValue; - return JsonConvert.DeserializeObject(user.Player.GetData(key)); + return user.Player.GetServerData(key, nullValue); } internal static T GetData(this User user, string key) => user.GetData(key, default); internal static void SetData(this User user, string key, object value) { - if (user == null) - { - return; - } - - key += "data_"; - user.Player.SetData(key, JsonConvert.SerializeObject(value)); + user.Player.SetServerData(key, value); } internal static void GiveWanteds(this User user, Player cop, int amount, string reason) diff --git a/ReallifeGamemode.Server/Finance/Economy.cs b/ReallifeGamemode.Server/Finance/Economy.cs index 4c551892..1ff424a2 100644 --- a/ReallifeGamemode.Server/Finance/Economy.cs +++ b/ReallifeGamemode.Server/Finance/Economy.cs @@ -171,7 +171,7 @@ namespace ReallifeGamemode.Server.Finance if (putInJail != 0 && minusJail) { - Jail.Check_PutBehindBars(client, false); + Jail.Check_PutBehindBars(u); } } diff --git a/ReallifeGamemode.Server/Wanted/Jail.cs b/ReallifeGamemode.Server/Wanted/Jail.cs index c9cfe660..12d21685 100644 --- a/ReallifeGamemode.Server/Wanted/Jail.cs +++ b/ReallifeGamemode.Server/Wanted/Jail.cs @@ -10,6 +10,7 @@ using ReallifeGamemode.Server.Services; using ReallifeGamemode.Services; using System.Diagnostics; using Newtonsoft.Json; +using ReallifeGamemode.Server.Managers; namespace ReallifeGamemode.Server.Wanted { @@ -18,105 +19,37 @@ namespace ReallifeGamemode.Server.Wanted private static Dictionary Jailtime { get; set; } = new Dictionary(); //time in seconds - public static void Check_PutBehindBars(Player client, bool announceHq = true) + public static void Check_PutBehindBars(User user) { - User user = client.GetUser(); + Player player = user.Player; + PositionManager.cuffPoints.Remove(player); if (user.JailTime > 0) { - client.RemoveAllWeapons(); - client.Health = 100; - client.Armor = 0; + player.RemoveAllWeapons(); + player.Health = 100; + player.Armor = 0; Random rnd = new Random(); int rndInt = rnd.Next(1, 3); if (rndInt == 1) - NAPI.Player.SpawnPlayer(client, new Vector3(458.9842, -997.2126, 24.91485)); //send client to jail + NAPI.Player.SpawnPlayer(player, new Vector3(458.9842, -997.2126, 24.91485)); //send client to jail if (rndInt == 2) - NAPI.Player.SpawnPlayer(client, new Vector3(459.696, -994.3766, 24.91486)); //send client to jail + NAPI.Player.SpawnPlayer(player, new Vector3(459.696, -994.3766, 24.91486)); //send client to jail if (rndInt == 3) - NAPI.Player.SpawnPlayer(client, new Vector3(458.3372, -1001.258, 24.91485)); //send client to jail + NAPI.Player.SpawnPlayer(player, new Vector3(458.3372, -1001.258, 24.91485)); //send client to jail Jailtime[user.Id] = user.JailTime; // 54 sec for each wanted star -> in total 45min for 50 Wanteds - int timeMinutes = 0; + int timeMinutes; - if (((int)(user.JailTime / 60)) <= 1 && user.JailTime != 0) + if ((user.JailTime / 60) <= 1 && user.JailTime != 0) { timeMinutes = 1; } else { - timeMinutes = (int)(user.JailTime / 60); + timeMinutes = (user.JailTime / 60); } - client.TriggerEvent("jailTime", timeMinutes); + player.TriggerEvent("jailTime", timeMinutes); return; } - if (user.Wanteds <= 0) - return; - using (var dbContext = new DatabaseContext()) - { - foreach (var copPlayer in NAPI.Pools.GetAllPlayers()) - { - if (!copPlayer.IsLoggedIn()) continue; - User cop = copPlayer.GetUser(); - if (cop?.FactionId == 1 || cop?.FactionId == 3) - { - int jailTime = user.Wanteds * 54; - if (cop.GetData("duty") && copPlayer.Position.DistanceTo2D(client.Position) <= 200 && (!copPlayer.HasData("isDead") || copPlayer.GetData("isDead") != true)) - { - if (!client.HasData("isDead") || client.GetData("isDead") == false) - { - jailTime /= 2; - } - - User clientUser = client.GetUser(dbContext); - - clientUser.JailTime = jailTime; - Jailtime[user.Id] = jailTime; // 54 sec for each wanted star -> in total 45min for 50 Wanteds - - clientUser.Wanteds = 0; - client.SetData("isDead", false); - client.RemoveAllWeapons(); - client.SetSharedData("blipColor", 0); - Random rnd = new Random(); - int rndInt = rnd.Next(1, 3); - if (rndInt == 1) - NAPI.Player.SpawnPlayer(client, new Vector3(458.9842, -997.2126, 24.91485)); //send client to jail - if (rndInt == 2) - NAPI.Player.SpawnPlayer(client, new Vector3(459.696, -994.3766, 24.91486)); //send client to jail - if (rndInt == 3) - NAPI.Player.SpawnPlayer(client, new Vector3(458.3372, -1001.258, 24.91485)); //send client to jail - - client.TriggerEvent("onPlayerRevived"); - MedicTask task = Medic.ReviveTasks.FirstOrDefault(t => t.Victim == client.Name); - Medic.RemoveTaskFromList(task); - client.Health = 100; - - int timeMinutes = 0; - - if (((int)(Jailtime[user.Id] / 60)) <= 1 && Jailtime[user.Id] != 0) - { - timeMinutes = 1; - } - else - { - timeMinutes = (int)(Jailtime[user.Id] / 60); - } - - client.TriggerEvent("jailTime", JsonConvert.SerializeObject(timeMinutes)); - - clientUser.SetBlipAndNametagColor(); - - if (announceHq) - { - ChatService.BroadcastFaction("!{#8181E9}HQ: " + user.Name + " wurde ins Gefängnis geliefert.", new List() { 1, 3 }); - } - } - else if (user.Wanteds > 0 && user.JailTime <= 0) - { - ChatService.BroadcastFaction("!{#8181E9}HQ: Der Verdächtigte " + user.Name + " wurde soeben ins Krankenhaus eingeliefert.", new System.Collections.Generic.List() { 1, 3 }); - } - } - } - dbContext.SaveChanges(); - } } /* @@ -136,23 +69,28 @@ namespace ReallifeGamemode.Server.Wanted public static void JailIn_Elapsed() { + using var dbContext = new DatabaseContext(); foreach (var player in NAPI.Pools.GetAllPlayers()) { - User user = player.GetUser(); - if (user != null && !Jailtime.ContainsKey(user.Id)) + if (player.Position.DistanceTo(new Vector3(458.9842, -997.2126, 24.91485)) > 7) { - foreach (var copPlayer in NAPI.Pools.GetAllPlayers()) + continue; + } + + User user = player.GetUser(); + + if (user != null && user.Wanteds > 0 && !Jailtime.ContainsKey(user.Id)) + { + foreach (var copPlayer in NAPI.Pools.GetAllPlayers().Where(u => u.IsLoggedIn() && u.IsDuty()) { - if (!copPlayer.IsLoggedIn()) return; - User cop = copPlayer.GetUser(); - if (cop.GetData("duty") && copPlayer.Position.DistanceTo2D(player.Position) <= 500 && (!copPlayer.HasData("isDead") || copPlayer.GetData("isDead") != true)) + if (!copPlayer.HasData("isDead") || copPlayer.GetData("isDead") != true) { - if (player.Position.DistanceTo2D(new Vector3(458.9842, -997.2126, 24.91485)) <= 7) + if (player.Position.DistanceTo(copPlayer.Position) < 5) { - if (player.Position.DistanceTo2D(copPlayer.Position) < 5) - { - Check_PutBehindBars(player); - } + user.SetJailTime(false); + user.AnnouncePlayerJailedIn(); + dbContext.SaveChanges(); + Check_PutBehindBars(user); } } } @@ -183,9 +121,10 @@ namespace ReallifeGamemode.Server.Wanted public static void JailOut_Elapsed() { + using var dbContext = new DatabaseContext(); foreach (var player in NAPI.Pools.GetAllPlayers()) { - User user = player.GetUser(); + User user = player.GetUser(dbContext); if (user != null && Jailtime.ContainsKey(user.Id)) { if (user.JailTime <= 0) @@ -197,11 +136,7 @@ namespace ReallifeGamemode.Server.Wanted } if (user.JailTime > 0) { - using (var dbContext = new DatabaseContext()) - { - player.GetUser(dbContext).JailTime -= 60; - dbContext.SaveChanges(); - } + user.JailTime -= 60; int timeMinutes = 0; @@ -219,15 +154,16 @@ namespace ReallifeGamemode.Server.Wanted } } } + dbContext.SaveChanges(); } - + [RemoteEvent("setPrisonerFree")] public void Release_Jail(Player cop, string client) { Player player = PlayerService.GetPlayerByNameOrId(client); if (player == null) return; - + User user = player.GetUser(); if (Jailtime.ContainsKey(user.Id)) { @@ -248,15 +184,15 @@ namespace ReallifeGamemode.Server.Wanted public static void Release_Jail_Admin(Player admin, Player target) { - User user = target.GetUser(); + using var dbContext = new DatabaseContext(); + User user = target.GetUser(dbContext); if (Jailtime.ContainsKey(user.Id)) { Jailtime.Remove(user.Id); - using (var dbContext = new DatabaseContext()) - { - target.GetUser(dbContext).JailTime = 0; - dbContext.SaveChanges(); - } + + user.JailTime = 0; + dbContext.SaveChanges(); + target.Health = 100; target.Position = new Vector3(427.879, -984.65, 30.71); diff --git a/ReallifeGamemode.Server/Wanted/WantedEscapeTimer.cs b/ReallifeGamemode.Server/Wanted/WantedEscapeTimer.cs index 5fc94dee..a9640a8b 100644 --- a/ReallifeGamemode.Server/Wanted/WantedEscapeTimer.cs +++ b/ReallifeGamemode.Server/Wanted/WantedEscapeTimer.cs @@ -35,9 +35,10 @@ namespace ReallifeGamemode.Server.Wanted public static void Timer_Elapsed() { + using var dbContext = new DatabaseContext(); foreach (var player in NAPI.Pools.GetAllPlayers()) { - User user = player.GetUser(); + User user = player.GetUser(dbContext); if (user != null && user.Wanteds > 0) { if (!waTimer.ContainsKey(user.Id)) @@ -68,30 +69,10 @@ namespace ReallifeGamemode.Server.Wanted { ResetWantedTimeToElapse(player); player.SendChatMessage("~y~Du hast erfolgtreich einen Wanted abgetaucht."); - using (var dbContext = new DatabaseContext()) + user.Wanteds -= 1; + if (user.Wanteds == 0) { - player.GetUser(dbContext).Wanteds -= 1; - if (player.GetUser(dbContext).Wanteds == 0) - { - switch (player.GetUser(dbContext).FactionId) - { - case null: - player.SetSharedData("blipColor", 0); - break; - - case 8: - player.SetSharedData("blipColor", 83); - break; - - case 7: - player.SetSharedData("blipColor", 52); - break; - - case 4: - player.SetSharedData("blipColor", 5); - break; - } - } + user.SetBlipAndNametagColor(); dbContext.SaveChanges(); } } From 0722816765bdbab5f2df0255b2b1ef3336599c48 Mon Sep 17 00:00:00 2001 From: hydrant Date: Wed, 7 Apr 2021 23:42:02 +0200 Subject: [PATCH 111/116] fix hq --- ReallifeGamemode.Server/Extensions/ClientExtension.cs | 2 +- ReallifeGamemode.Server/Wanted/Jail.cs | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index a1d4d914..e20a998e 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -109,7 +109,7 @@ namespace ReallifeGamemode.Server.Extensions public static bool IsAlive(this Player player) { - return !player.HasData("isDead") || (bool)player.GetData("isDead") == false; + return !player.HasData("isDead") || player.GetData("isDead") == false; } public static T GetServerData(this Player player, string key, T defaultValue = default) diff --git a/ReallifeGamemode.Server/Wanted/Jail.cs b/ReallifeGamemode.Server/Wanted/Jail.cs index 12d21685..4a92c263 100644 --- a/ReallifeGamemode.Server/Wanted/Jail.cs +++ b/ReallifeGamemode.Server/Wanted/Jail.cs @@ -81,9 +81,10 @@ namespace ReallifeGamemode.Server.Wanted if (user != null && user.Wanteds > 0 && !Jailtime.ContainsKey(user.Id)) { - foreach (var copPlayer in NAPI.Pools.GetAllPlayers().Where(u => u.IsLoggedIn() && u.IsDuty()) + foreach (var copPlayer in NAPI.Pools.GetAllPlayers().Where(u => u.IsLoggedIn() && u.IsDuty() && u.IsAlive())) { - if (!copPlayer.HasData("isDead") || copPlayer.GetData("isDead") != true) + User copUser = copPlayer.GetUser(dbContext); + if (copUser.FactionId == 1 || copUser.FactionId == 3) { if (player.Position.DistanceTo(copPlayer.Position) < 5) { @@ -91,6 +92,7 @@ namespace ReallifeGamemode.Server.Wanted user.AnnouncePlayerJailedIn(); dbContext.SaveChanges(); Check_PutBehindBars(user); + break; } } } From b3475efbe8379e45b42db930db878a4783bdfc7b Mon Sep 17 00:00:00 2001 From: hydrant Date: Wed, 7 Apr 2021 23:50:56 +0200 Subject: [PATCH 112/116] fix jailtime --- ReallifeGamemode.Server/Wanted/Jail.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ReallifeGamemode.Server/Wanted/Jail.cs b/ReallifeGamemode.Server/Wanted/Jail.cs index 4a92c263..fe51b4b1 100644 --- a/ReallifeGamemode.Server/Wanted/Jail.cs +++ b/ReallifeGamemode.Server/Wanted/Jail.cs @@ -45,10 +45,9 @@ namespace ReallifeGamemode.Server.Wanted } else { - timeMinutes = (user.JailTime / 60); + timeMinutes = user.JailTime / 60; } player.TriggerEvent("jailTime", timeMinutes); - return; } } @@ -77,7 +76,7 @@ namespace ReallifeGamemode.Server.Wanted continue; } - User user = player.GetUser(); + User user = player.GetUser(dbContext); if (user != null && user.Wanteds > 0 && !Jailtime.ContainsKey(user.Id)) { From e3cc8cf191f230d183ffae799130579b815649d9 Mon Sep 17 00:00:00 2001 From: hydrant Date: Thu, 8 Apr 2021 00:00:54 +0200 Subject: [PATCH 113/116] fix death dbchanges --- ReallifeGamemode.Server/Events/Death.cs | 39 ++++++++++++------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/ReallifeGamemode.Server/Events/Death.cs b/ReallifeGamemode.Server/Events/Death.cs index 8cd14748..fcbe84e5 100644 --- a/ReallifeGamemode.Server/Events/Death.cs +++ b/ReallifeGamemode.Server/Events/Death.cs @@ -58,28 +58,27 @@ namespace ReallifeGamemode.Server.Events killerPosZ = -1; killerHeading = -1; } - else + else if (killer.IsLoggedIn()) { - var killerUser = killer.GetUser(); - if (killerUser == null) + var killerUser = killer.GetUser(dbContext); + if (killerUser != null) { - return; - } - killerId = killerUser.Id; - killerPosX = killer.Position.X; - killerPosY = killer.Position.Y; - killerPosZ = killer.Position.Z; - killerHeading = killer.Heading; - if (player.HasData("inGangWar") && killer.HasData("inGangWar")) - { - Gangwar.Gangwar.GangwarKill(killer, player); - } + killerId = killerUser.Id; + killerPosX = killer.Position.X; + killerPosY = killer.Position.Y; + killerPosZ = killer.Position.Z; + killerHeading = killer.Heading; + if (player.HasData("inGangWar") && killer.HasData("inGangWar")) + { + Gangwar.Gangwar.GangwarKill(killer, player); + } - if (player != killer) - { - Autowanted.Check_AutoWanted(killer, player); - string message = "~y~[HINWEIS]: " + killer.Name + " hat " + player.Name + " getötet (" + Managers.WeaponManager.GetCauseOfDeathByHash(reason) + ")"; - ChatService.BroadcastAdmin(message, AdminLevel.ADMIN); + if (player != killer) + { + Autowanted.Check_AutoWanted(killer, player); + string message = "~y~[HINWEIS]: " + killer.Name + " hat " + player.Name + " getötet (" + Managers.WeaponManager.GetCauseOfDeathByHash(reason) + ")"; + ChatService.BroadcastAdmin(message, AdminLevel.ADMIN); + } } } @@ -172,7 +171,6 @@ namespace ReallifeGamemode.Server.Events CauseOfDeath = reason.ToString() }; dbContext.DeathLogs.Add(dead); - dbContext.SaveChanges(); } } Job.JobBase job = Managers.JobManager.GetJob(player.GetUser().JobId ?? -1); @@ -225,6 +223,7 @@ namespace ReallifeGamemode.Server.Events //ChatService.SendMessage(player, "Debug10"); } } + dbContext.SaveChanges(); } [RemoteEvent("RespawnPlayerAtHospital")] From 85ab6c09c22266cc0bb4e803958e2b72a53f0521 Mon Sep 17 00:00:00 2001 From: hydrant Date: Thu, 8 Apr 2021 00:03:05 +0200 Subject: [PATCH 114/116] fix death --- ReallifeGamemode.Server/Events/Death.cs | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/ReallifeGamemode.Server/Events/Death.cs b/ReallifeGamemode.Server/Events/Death.cs index fcbe84e5..f6f0e0c6 100644 --- a/ReallifeGamemode.Server/Events/Death.cs +++ b/ReallifeGamemode.Server/Events/Death.cs @@ -44,21 +44,13 @@ namespace ReallifeGamemode.Server.Events { ChatService.SendMessage(player, "Du bist durch " + (killer?.Name ?? "Niemanden") + " gestorben: " + reason.ToString()); } - int? killerId; - float killerPosX; - float killerPosY; - float killerPosZ; - float killerHeading; + int? killerId = null; + float killerPosX = -1; + float killerPosY = -1; + float killerPosZ = -1; + float killerHeading = -1; - if (killer == null || killer.IsNull) - { - killerId = null; - killerPosX = -1; - killerPosY = -1; - killerPosZ = -1; - killerHeading = -1; - } - else if (killer.IsLoggedIn()) + if (killer.IsLoggedIn()) { var killerUser = killer.GetUser(dbContext); if (killerUser != null) From a34e478b3a8a484164cc7440078c99bd566ee376 Mon Sep 17 00:00:00 2001 From: hydrant Date: Thu, 8 Apr 2021 00:07:10 +0200 Subject: [PATCH 115/116] blip nametag farbe --- ReallifeGamemode.Server/Wanted/Jail.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ReallifeGamemode.Server/Wanted/Jail.cs b/ReallifeGamemode.Server/Wanted/Jail.cs index fe51b4b1..d8273fed 100644 --- a/ReallifeGamemode.Server/Wanted/Jail.cs +++ b/ReallifeGamemode.Server/Wanted/Jail.cs @@ -21,6 +21,7 @@ namespace ReallifeGamemode.Server.Wanted public static void Check_PutBehindBars(User user) { + user.SetBlipAndNametagColor(); Player player = user.Player; PositionManager.cuffPoints.Remove(player); if (user.JailTime > 0) @@ -88,6 +89,7 @@ namespace ReallifeGamemode.Server.Wanted if (player.Position.DistanceTo(copPlayer.Position) < 5) { user.SetJailTime(false); + user.SetBlipAndNametagColor(); user.AnnouncePlayerJailedIn(); dbContext.SaveChanges(); Check_PutBehindBars(user); From a2d6039736134993053d7d024f195827a9452d3f Mon Sep 17 00:00:00 2001 From: VegaZ Date: Thu, 8 Apr 2021 00:20:52 +0200 Subject: [PATCH 116/116] =?UTF-8?q?Move=20Job=20Infos=20Interaktionsmen?= =?UTF-8?q?=C3=BC=20in=20eigenes=20Men=C3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Interaction/interactionmenu.ts | 74 +++++++++++++++++-- ReallifeGamemode.Client/global.d.ts | 10 ++- ReallifeGamemode.Server/Events/Key.cs | 11 ++- 3 files changed, 86 insertions(+), 9 deletions(-) diff --git a/ReallifeGamemode.Client/Interaction/interactionmenu.ts b/ReallifeGamemode.Client/Interaction/interactionmenu.ts index d664ecf3..53eddcd8 100644 --- a/ReallifeGamemode.Client/Interaction/interactionmenu.ts +++ b/ReallifeGamemode.Client/Interaction/interactionmenu.ts @@ -27,6 +27,8 @@ export default function (globalData: IGlobalData) { var groupItem = new UIMenuItem("Gruppe", "Verwalte deine Gruppe"); + var jobItem = new UIMenuItem("Job", "Infos zu deinem Job"); + var paycheckItem = new UIMenuItem("Gehaltsscheck", "Schaue dir deinen Verdienst der letzten Stunde an"); var licenseItem = new UIMenuItem("Lizenzen", "Lizenzen Informationen"); @@ -41,10 +43,11 @@ export default function (globalData: IGlobalData) { var groupRank = null; - mp.events.add("SERVER:InteractionMenu_OpenMenu", (accountDataJson: string, factionleader: string, faction: string, group: string, factionInvite: boolean, groupInvite: boolean, ticket_boolean: boolean, ticket_amount, house: boolean) => { + mp.events.add("SERVER:InteractionMenu_OpenMenu", (accountDataJson: string, factionleader: string, jobDataJson: string, faction: string, group: string, factionInvite: boolean, groupInvite: boolean, ticket_boolean: boolean, ticket_amount, house: boolean) => { var accountData: AccountData = JSON.parse(accountDataJson); + var jobData: JobData = JSON.parse(jobDataJson); //var ticket_amount = JSON.parse(ticket_amountJson); var menu = getInteractionMenu(); @@ -77,6 +80,8 @@ export default function (globalData: IGlobalData) { menu.AddItem(factionleaderItem); menu.BindMenuToItem(getFactionLeaderMenu(faction, accountData.factionVehicles, accountData.stateFaction, menu), factionleaderItem); } + menu.AddItem(jobItem); + menu.BindMenuToItem(getJobMenu(jobData, menu), jobItem); if (group) { groupItem.SetRightLabel(group); @@ -206,11 +211,7 @@ export default function (globalData: IGlobalData) { menuItem = new UIMenuItem("Fraktionsrang"); menuItem.SetRightLabel(data.factionRank); accountMenu.AddItem(menuItem); - } - - menuItem = new UIMenuItem("Job"); - menuItem.SetRightLabel(data.job); - accountMenu.AddItem(menuItem); + } if (data.group != null) { menuItem = new UIMenuItem("Gruppe"); @@ -365,6 +366,67 @@ export default function (globalData: IGlobalData) { return factionMenu; } + function getJobMenu(jobdata: JobData, parentMenu: NativeUI.Menu): NativeUI.Menu { + var jobMenu = new NativeUI.Menu("Job", "Job Infos / Skillpunkte", new Point(0, screenRes.y / 3), null, null); + + var pilotLevel; + var busLevel; + + if (jobdata.pilotskill >= 300) { + pilotLevel = 2; + } else { + pilotLevel = 1; + } + + if (jobdata.busskill >= 800) { + busLevel = 3; + } else if (jobdata.busskill >= 300) { + busLevel = 2; + } else { + busLevel = 1; + } + + var actJobItem = new UIMenuItem("Aktueller Job:"); + actJobItem.SetRightLabel(jobdata.job) + jobMenu.AddItem(actJobItem); + + var pilotSkillItem = new UIMenuItem("Pilot Skill (LVL " + pilotLevel + ")"); + switch (pilotLevel) { + case 1: + pilotSkillItem.SetRightLabel(jobdata.pilotskill + "/300") + break; + case 2: + pilotSkillItem.SetRightLabel(jobdata.pilotskill + "/MAX") + break; + } + jobMenu.AddItem(pilotSkillItem); + + var busSkillItem = new UIMenuItem("Bus Skill (LVL " + busLevel + ")"); + switch (busLevel) { + case 1: + busSkillItem.SetRightLabel(jobdata.busskill + "/300") + break; + case 2: + busSkillItem.SetRightLabel(jobdata.busskill + "/800") + break; + case 3: + busSkillItem.SetRightLabel(jobdata.busskill + "/MAX") + break; + } + jobMenu.AddItem(busSkillItem); + + var wageItem = new UIMenuItem("Verdienst"); + if (jobdata.wage > 0) { + wageItem.SetRightLabel("~g~$" + jobdata.wage.toString()) + } else { + wageItem.SetRightLabel("$" + jobdata.wage.toString()) + } + jobMenu.AddItem(wageItem); + jobMenu.Visible = false; + mp.gui.chat.show(false); + return jobMenu; + } + function getGroupMenu(group: string, parentMenu: NativeUI.Menu): NativeUI.Menu { var groupMenu = new NativeUI.Menu("Gruppe", group, new Point(0, screenRes.y / 3), null, null); if (groupRank == "Manager" || groupRank == "Besitzer") groupMenu.AddItem(new UIMenuItem("Spieler einladen")); diff --git a/ReallifeGamemode.Client/global.d.ts b/ReallifeGamemode.Client/global.d.ts index 266c36d6..118dc77c 100644 --- a/ReallifeGamemode.Client/global.d.ts +++ b/ReallifeGamemode.Client/global.d.ts @@ -14,7 +14,6 @@ declare type AccountData = { factionRank: string; group: string; groupRank: string; - job: string; paycheck: Paycheck; licenses: Licenses; vehicles: VehicleData[]; @@ -25,6 +24,13 @@ declare type AccountData = { userWarn: number; } +declare type JobData = { + job: string; + busskill: number; + pilotskill: number; + wage: number; +} + declare type VehicleData = { Id: number; Model: number; @@ -44,6 +50,8 @@ declare type Paycheck = { otheramount: number; } + + declare type Licenses = { drivingLicenseCar: boolean; drivingLicenseBike: boolean; diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 8cba9c05..40621ae1 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -152,7 +152,6 @@ namespace ReallifeGamemode.Server.Events factionRank = u.GetFactionRank().RankName, group = u.Group?.Name ?? "Keine", groupRank = u.GroupRank.GetName(), - job = JobManager.GetJob(u.JobId ?? 0)?.Name ?? "Keiner", paycheck, licenses, vehicles, @@ -162,6 +161,14 @@ namespace ReallifeGamemode.Server.Events userWarn = u.warn, }; + var jobData = new + { + job = JobManager.GetJob(u.JobId ?? 0)?.Name ?? "Keiner", + busskill = u.BusSkill, + pilotskill = u.PilotSkill, + wage = u.Wage, + }; + string faction = u.Faction?.Name ?? "Zivilist"; string factionleader = u.FactionLeader ? u.Faction.Name : null; string group = u.Group != null ? u.Group.Name : null; @@ -187,7 +194,7 @@ namespace ReallifeGamemode.Server.Events pay_amount = player.GetData("pay_amount"); } - player.TriggerEvent("SERVER:InteractionMenu_OpenMenu", JsonConvert.SerializeObject(accountData), factionleader, faction, group, factionInvite, groupInvite, ticket_boolean, ticket_amount, pay_amount, house); + player.TriggerEvent("SERVER:InteractionMenu_OpenMenu", JsonConvert.SerializeObject(accountData), factionleader, JsonConvert.SerializeObject(jobData), faction, group, factionInvite, groupInvite, ticket_boolean, ticket_amount, pay_amount, house); } [RemoteEvent("keyPress:E")]