Implement experimental player sleeping percentage handling

This commit is contained in:
zontreck 2025-03-10 18:57:27 -07:00
parent 9a8b9d1545
commit 720dafea87
2 changed files with 45 additions and 7 deletions

View file

@ -38,7 +38,10 @@ namespace AriasServerUtils
GlobalConstants.characterInvClassName
};
List<EntityAgent> SleepingPlayers { get; set; }
List<EntityAgent> SleepingPlayers { get; set; } = new();
float OriginalSpeed { get; set; } = 0.0f;
public double Hours { get; private set; } = 0.0;
bool Sleeping { get; set; } = false;
/// <summary>
/// Method to register all mod blocks
@ -76,10 +79,6 @@ namespace AriasServerUtils
api.Event.ServerRunPhase(EnumServerRunPhase.GameReady, OnGameReady);
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;
api.Event.PlayerDisconnect += OnPlayerDC;
@ -241,6 +240,22 @@ namespace AriasServerUtils
private void OnCheckSleepingPlayers()
{
if (API.Side == EnumAppSide.Client) return; // This must only ever be called on the server!
if (Sleeping)
{
if (API.World.Calendar.TotalHours - Hours >= 7)
{
Sleeping = false;
foreach (var player in SleepingPlayers)
{
EntityBehaviorTiredness ebt = player.GetBehavior("tiredness") as EntityBehaviorTiredness;
ebt.IsSleeping = false;
}
SleepingPlayers.Clear();
API.World.Calendar.CalendarSpeedMul = OriginalSpeed;
}
return;
}
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
@ -282,6 +297,22 @@ namespace AriasServerUtils
if (Percentage >= config.PlayerSleepingPercentage)
{
// Call the API to make sleep happen
foreach (var bed in BEBs)
{
if (bed.MountedBy != null) SleepingPlayers.Add(bed.MountedBy);
// Start sleep
EntityBehaviorTiredness EBT = bed.MountedBy.GetBehavior("tiredness") as EntityBehaviorTiredness;
EBT.IsSleeping = true;
// Get current calendar speed
OriginalSpeed = API.World.Calendar.CalendarSpeedMul;
Hours = API.World.Calendar.TotalHours;
Sleeping = true;
API.World.Calendar.CalendarSpeedMul = 4;
}
}
}
@ -445,6 +476,13 @@ namespace AriasServerUtils
// -> Step 3. Load Mod Warps <-
serverWarps = API.LoadModConfig<Warps>(GetConfigurationFile("warps", ModConfigType.Global));
if (serverWarps == null) serverWarps = new Warps();
API.Event.Timer(OnCheckModDirty, 20);
API.Event.Timer(OnCheckPlayerCooldowns, 1);
API.Event.Timer(OnCheckSleepingPlayers, 5);
API.Event.Timer(RTPFactory.HandleRTPChecking, 1);
}
public string GetConfigurationFile(string sName, ModConfigType type)

View file

@ -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 @ 4:37 PM MST",
"version": "1.0.7-dev.1",
"description": "A collection of server utilities\n\nBuild Date: 03-10-2025 @ 6:56 PM MST",
"version": "1.0.7-dev.2",
"dependencies": {
"game": ""
}