From 62ac08e98dc3f5e8dae288b35c6366240eb00b59 Mon Sep 17 00:00:00 2001 From: hydrant Date: Tue, 13 Apr 2021 20:32:20 +0200 Subject: [PATCH] afk system --- ReallifeGamemode.Client/Player/antiafk.ts | 45 +++++++++++++++++++ ReallifeGamemode.Client/global.d.ts | 1 + ReallifeGamemode.Client/index.ts | 4 ++ ReallifeGamemode.Server/Events/PlayerEvent.cs | 10 +++++ .../Extensions/ClientExtension.cs | 5 +++ ReallifeGamemode.Server/Finance/Economy.cs | 5 +++ .../WeaponDeal/WeaponDealManager.cs | 8 +++- 7 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 ReallifeGamemode.Client/Player/antiafk.ts diff --git a/ReallifeGamemode.Client/Player/antiafk.ts b/ReallifeGamemode.Client/Player/antiafk.ts new file mode 100644 index 00000000..443a61db --- /dev/null +++ b/ReallifeGamemode.Client/Player/antiafk.ts @@ -0,0 +1,45 @@ +export default function antiAfk(globalData: IGlobalData) { + let lastPosition: Vector3Mp = mp.players.local.position; + let afkCounter: number = 0; + + let afkStatus: boolean = false; + + setInterval(checkAfkPosition, 1000 * 10); + + function checkAfkPosition() { + + if (!globalData.LoggedIn) { + return; + } + + let lp = lastPosition; + let np = mp.players.local.position; + + let distance = mp.game.gameplay.getDistanceBetweenCoords(lp.x, lp.y, lp.z, np.x, np.y, np.z, false); + + if (distance <= 5) { + if (!afkStatus) { + afkCounter++; + } + } else { + afkCounter = 0; + if (afkStatus) { + afkStatus = false; + globalData.IsAfk = afkStatus; + setServerAfkStatus(afkStatus); + } + } + + if (afkCounter >= 12) { + afkStatus = true; + globalData.IsAfk = afkStatus; + setServerAfkStatus(afkStatus); + } + + lastPosition = np; + } + + function setServerAfkStatus(status: boolean) { + mp.events.callRemote("CLIENT:SetAfkStatus", status); + } +} \ No newline at end of file diff --git a/ReallifeGamemode.Client/global.d.ts b/ReallifeGamemode.Client/global.d.ts index 2242dd17..9dd783c1 100644 --- a/ReallifeGamemode.Client/global.d.ts +++ b/ReallifeGamemode.Client/global.d.ts @@ -4,6 +4,7 @@ InMenu: boolean, InChat: boolean, LoggedIn: boolean, + IsAfk: boolean, } declare type AccountData = { diff --git a/ReallifeGamemode.Client/index.ts b/ReallifeGamemode.Client/index.ts index 303729b5..819e153d 100644 --- a/ReallifeGamemode.Client/index.ts +++ b/ReallifeGamemode.Client/index.ts @@ -14,6 +14,7 @@ let globalData: IGlobalData = { HideGui: false, InChat: false, LoggedIn: false, + IsAfk: false, get InMenu(): boolean { return inMenu; @@ -258,6 +259,9 @@ animationSync(); import antiCheat from './admin/anticheat'; antiCheat(globalData); +import antiAfk from './Player/antiafk'; +antiAfk(globalData); + require('./Gui/policedepartment'); require('./Gui/helptext'); diff --git a/ReallifeGamemode.Server/Events/PlayerEvent.cs b/ReallifeGamemode.Server/Events/PlayerEvent.cs index 4f6ed48b..ad8b51fc 100644 --- a/ReallifeGamemode.Server/Events/PlayerEvent.cs +++ b/ReallifeGamemode.Server/Events/PlayerEvent.cs @@ -13,5 +13,15 @@ namespace ReallifeGamemode.Server.Events { player.SafeTeleport(pos); } + + [RemoteEvent("CLIENT:SetAfkStatus")] + public void SetPlayerAfkStatus(Player player, bool status) + { + player.SetServerData("isAfk", status); + if(status) + { + player.SendNotification("Du wurdest ~b~AFK~s~ gesetzt", true); + } + } } } diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index 9c354a51..23977951 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -136,6 +136,11 @@ namespace ReallifeGamemode.Server.Extensions return player.GetServerData("duty", false); } + public static bool IsAfk(this Player player) + { + return player.GetServerData("isAfk", false); + } + public static bool IsAlive(this Player player) { return !player.HasData("isDead") || player.GetData("isDead") == false; diff --git a/ReallifeGamemode.Server/Finance/Economy.cs b/ReallifeGamemode.Server/Finance/Economy.cs index 78284419..391704e2 100644 --- a/ReallifeGamemode.Server/Finance/Economy.cs +++ b/ReallifeGamemode.Server/Finance/Economy.cs @@ -189,6 +189,11 @@ namespace ReallifeGamemode.Server.Finance using var dbContext = new DatabaseContext(); foreach (var player in NAPI.Pools.GetAllPlayers().Where(p => p.IsLoggedIn())) { + if(player.IsAfk()) + { + continue; + } + User user = player.GetUser(dbContext); if(user == null) { diff --git a/ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs b/ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs index 692f018e..54830d89 100644 --- a/ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs +++ b/ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs @@ -30,6 +30,11 @@ namespace ReallifeGamemode.Server.WeaponDeal public void SrvEVENT_startWeaponDeal(Player client) { var user = client.GetUser(); + if(user == null || user.FactionId == null) + { + return; + } + using (var context = new DatabaseContext(true)) { FactionVehicle factionVehicle = context.FactionVehicles.Where(f => f.Model == VehicleHash.Burrito3 || f.Model == VehicleHash.Policet).ToList().Where(f => f.GetOwners().Contains(user.FactionId ?? 0)).FirstOrDefault(); @@ -40,7 +45,6 @@ namespace ReallifeGamemode.Server.WeaponDeal return; } - Vehicle fVeh = VehicleManager.GetVehicleFromServerVehicle(factionVehicle); if (checkWeaponDbyVehicle(fVeh)) @@ -58,7 +62,7 @@ namespace ReallifeGamemode.Server.WeaponDeal WeaponDealPoints.factionWeaponDeal[user.FactionId.Value] = -1; Vector3 vector; - vector = WeaponDealPoints.getRndWD_Route(client.GetUser().FactionId.Value); + vector = WeaponDealPoints.getRndWD_Route(user.FactionId.Value); if (vector == new Vector3()) return; fVeh.SetData("weaponDealPoint", vector);