From 9a8b9d154544e77aae2445254dde6f1afd6cf82d Mon Sep 17 00:00:00 2001 From: zontreck Date: Mon, 10 Mar 2025 17:17:25 -0700 Subject: [PATCH] Begin to add the player sleeping percentage system --- AriasServerUtils/ASUModSystem.cs | 50 ++++++++++++++++++++++++++++++++ AriasServerUtils/modinfo.json | 4 +-- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/AriasServerUtils/ASUModSystem.cs b/AriasServerUtils/ASUModSystem.cs index e2775d2..27ff056 100644 --- a/AriasServerUtils/ASUModSystem.cs +++ b/AriasServerUtils/ASUModSystem.cs @@ -38,6 +38,8 @@ namespace AriasServerUtils GlobalConstants.characterInvClassName }; + List SleepingPlayers { get; set; } + /// /// Method to register all mod blocks /// @@ -76,6 +78,7 @@ namespace AriasServerUtils api.Event.ServerRunPhase(EnumServerRunPhase.Shutdown, OnShutdown); api.Event.Timer(OnCheckModDirty, 20); api.Event.Timer(OnCheckPlayerCooldowns, 1); + api.Event.Timer(OnCheckSleepingPlayers, 5); api.Event.Timer(RTPFactory.HandleRTPChecking, 1); api.Event.PlayerDeath += OnPlayerDeath; api.Event.PlayerJoin += OnPlayerJoin; @@ -235,6 +238,53 @@ namespace AriasServerUtils api.ChatCommands.Create("listcooldowns").RequiresPrivilege(Privilege.chat).WithDescription("Lists the cooldown settings on the server, as well as your own active cooldowns if applicable.").HandleWith(Events.HandleListCooldowns); } + private void OnCheckSleepingPlayers() + { + if (API.Side == EnumAppSide.Client) return; // This must only ever be called on the server! + if (config.PlayerSleepingPercentage == 100) return; // Normal behavior + // Iterate over all players, get their entity, check if mounted on a bed. + // If mounted on a bed, check tiredness + int TotalOnline = API.World.AllOnlinePlayers.Length; + int TotalInBed = 0; + + bool isAlreadySleeping = false; + + List BEBs = new(); + + foreach (var player in API.World.AllOnlinePlayers) + { + EntityAgent ePlay = player.Entity; + if (ePlay.MountedOn is BlockEntityBed beb) + { + BEBs.Add(beb); + TotalInBed++; + } + if (ePlay.MountedOn == null) + { + if (SleepingPlayers.Contains(ePlay)) + { + EntityBehaviorTiredness ebt = ePlay.GetBehavior("tiredness") as EntityBehaviorTiredness; + if (ebt != null) + ebt.IsSleeping = false; + } + } + + EntityBehaviorTiredness EBT = ePlay.GetBehavior("tiredness") as EntityBehaviorTiredness; + if (EBT == null) continue; + if (EBT.IsSleeping) isAlreadySleeping = true; + } + + if (isAlreadySleeping) return; // Abort + + SleepingPlayers.Clear(); + + int Percentage = TotalInBed * 100 / TotalOnline; + if (Percentage >= config.PlayerSleepingPercentage) + { + // Call the API to make sleep happen + } + } + private void OnCheckPlayerCooldowns() { foreach (var cdEntry in ServerUtilities.mPlayerData) diff --git a/AriasServerUtils/modinfo.json b/AriasServerUtils/modinfo.json index e8b5349..f30a8d5 100644 --- a/AriasServerUtils/modinfo.json +++ b/AriasServerUtils/modinfo.json @@ -3,8 +3,8 @@ "modid": "ariasserverutils", "name": "Aria's Server Utilities", "authors": ["zontreck"], - "description": "A collection of server utilities\n\nBuild Date: 03-10-2025 @ 12:04 PM MST", - "version": "1.0.6", + "description": "A collection of server utilities\n\nBuild Date: 03-10-2025 @ 4:37 PM MST", + "version": "1.0.7-dev.1", "dependencies": { "game": "" }