leadercraft/Leadercraft/Scoring/State.cs

122 lines
3.3 KiB
C#

using System;
using GamecraftModdingAPI;
using GamecraftModdingAPI.Players;
using GamecraftModdingAPI.Tasks;
using GamecraftModdingAPI.Utility;
using Leadercraft.Server;
namespace Leadercraft.Scoring
{
internal static class State
{
public static bool IsInGame { get; private set; }= false;
public static bool IsPlayingGame { get; private set; } = false;
public static DateTime GameEnterTime { get; private set; }
public static DateTime GameStartTime { get; private set; }
public static TimeSpan GamePlayTime { get; private set; }
public static float[] PlayerLocation { get; private set; }
public static ulong GameId { get; private set; }
public static int Score { get; private set; }
public static bool IsGameComplete { get; private set; }
public static bool IsGameSynced { get; private set; }
private static bool isBadGame = false;
private static Player localPlayer = null;
public static void EnterGame()
{
if (IsInGame) return;
IsInGame = true;
IsGameSynced = false;
IsGameComplete = false;
GameId = Server.Tools.GameId;
GameEnterTime = DateTime.UtcNow;
Logging.MetaLog($"Entering game {GameId} at {GameEnterTime}");
}
public static void ExitGame()
{
if (!IsInGame) return;
Logging.MetaLog($"Exiting game {GameId}");
IsInGame = false;
}
public static void StartPlayingGame()
{
if (IsPlayingGame) return;
Logging.MetaLog($"Starting to play game {GameId}");
Score = 0;
IsPlayingGame = true;
GameStartTime = DateTime.UtcNow;
// schedule game loop async task
Action loop = () => { loopPass(); };
ISchedulable looper = new Repeatable(loop, () => { return State.IsInGame; }, LeadercraftPlugin.LoopDelay);
Scheduler.Schedule(looper);
}
public static void StopPlayingGame()
{
if (!IsPlayingGame) return;
GamePlayTime = DateTime.UtcNow - GameStartTime;
Logging.MetaLog($"Stopping game {GameId} after {GamePlayTime.TotalSeconds}s");
IsPlayingGame = false;
}
public static void SetLocation(float x, float y, float z)
{
PlayerLocation = new float[] { x, y, z };
}
public static void AddScore(int points)
{
Score += points;
}
public static Server.CriteriaStruct Criteria()
{
IsGameSynced = true;
return new Server.CriteriaStruct
{
Location = new float[][] { PlayerLocation, PlayerLocation },
Time = Convert.ToInt32(Math.Round(GamePlayTime.TotalSeconds, MidpointRounding.AwayFromZero)),
GameID = GameId,
PlayerID = 0,
Complete = IsGameComplete,
Points = Score,
};
}
private static void loopPass()
{
if (!State.IsPlayingGame) return;
if (localPlayer == null && Player.Exists(PlayerType.Local))
{
localPlayer = new Player(PlayerType.Local);
isBadGame = localPlayer.GameOver;
if (isBadGame)
{
GamecraftModdingAPI.Utility.Logging.MetaLog($"Ignoring game {GameId} since it does not seem to have a GameOver state.");
}
}
if (localPlayer == null) return;
if (localPlayer.GameOver && !localPlayer.Dead && !isBadGame)
{
State.StopPlayingGame();
//State.GamePlayTime.TotalSeconds
UploadJob scoreJob = new UploadJob(State.Score, State.GamePlayTime.TotalSeconds, localPlayer.Position, Tools.UserId, Tools.UserName, Tools.GameId);
scoreJob.RunInNewThread();
}
}
}
}